百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT知识 > 正文

C#实现归并排序与快速排序

liuian 2025-08-01 18:41 104 浏览

字数 914,阅读大约需 5 分钟

C#实现归并排序与快速排序

以下是使用 C# 实现的归并排序和快速排序算法代码:

using System;
using System.Collections.Generic;

publicclassSortingAlgorithms
{
// 归并排序入口方法
public static void MergeSort<T>(T[] arr) where T : IComparable<T>
{
if (arr == || arr.Length <= 1)
return;

MergeSort(arr, 0, arr.Length - 1);
}

// 归并排序递归实现
private static void MergeSort<T>(T[] arr, int left, int right) where T : IComparable<T>
{
if (left < right)
{
int mid = left + (right - left) / 2;
MergeSort(arr, left, mid); // 排序左半部分
MergeSort(arr, mid + 1, right); // 排序右半部分
Merge(arr, left, mid, right); // 合并两个有序数组
}
}

// 合并两个有序子数组
private static void Merge<T>(T[] arr, int left, int mid, int right) where T : IComparable<T>
{
int n1 = mid - left + 1;
int n2 = right - mid;

// 创建临时数组
T[] L = new T[n1];
T[] R = new T[n2];

// 拷贝数据到临时数组
Array.Copy(arr, left, L, 0, n1);
Array.Copy(arr, mid + 1, R, 0, n2);

// 合并临时数组
int i = 0, j = 0, k = left;
while (i < n1 && j < n2)
{
if (L[i].CompareTo(R[j]) <= 0)
{
arr[k] = L[i];
i++;
}
else
{
arr[k] = R[j];
j++;
}
k++;
}

// 拷贝剩余元素
while (i < n1)
{
arr[k] = L[i];
i++;
k++;
}

while (j < n2)
{
arr[k] = R[j];
j++;
k++;
}
}

// 快速排序入口方法
public static void QuickSort<T>(T[] arr) where T : IComparable<T>
{
if (arr == || arr.Length <= 1)
return;

QuickSort(arr, 0, arr.Length - 1);
}

// 快速排序递归实现
private static void QuickSort<T>(T[] arr, int low, int high) where T : IComparable<T>
{
if (low < high)
{
int pi = Partition(arr, low, high); // 获取分区点
QuickSort(arr, low, pi - 1); // 排序左分区
QuickSort(arr, pi + 1, high); // 排序右分区
}
}

// Lomuto分区方案
private static int Partition<T>(T[] arr, int low, int high) where T : IComparable<T>
{
T pivot = arr[high]; // 选择最后一个元素作为基准
int i = low - 1; // 较小元素的分界点

for (int j = low; j < high; j++)
{
if (arr[j].CompareTo(pivot) < 0)
{
i++;
Swap(arr, i, j); // 交换元素
}
}

Swap(arr, i + 1, high); // 将基准放到正确位置
return i + 1; // 返回基准索引
}

// 交换数组元素
private static void Swap<T>(T[] arr, int i, int j)
{
T temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}

// 测试代码
public static void Main()
{
int[] numbers = { 12, 11, 13, 5, 6, 7 };

Console.WriteLine("Original array:");
PrintArray(numbers);

// 测试归并排序
MergeSort(numbers);
Console.WriteLine("\nSorted with MergeSort:");
PrintArray(numbers);

int[] numbers2 = { 10, 7, 8, 9, 1, 5 };
Console.WriteLine("\nNew array for QuickSort:");
PrintArray(numbers2);

// 测试快速排序
QuickSort(numbers2);
Console.WriteLine("\nSorted with QuickSort:");
PrintArray(numbers2);
}

// 辅助方法:打印数组
private static void PrintArray<T>(T[] arr)
{
foreach (T item in arr)
{
Console.Write(item + " ");
}
Console.WriteLine();
}
}

算法说明:

归并排序(Merge Sort)

  1. 1. 分治策略
  • o 将数组分成两半
  • o 递归排序左右子数组
  • o 合并两个有序子数组
  • 2. 时间复杂度
    • o 最优/平均/最差:O(n log n)
    • o 空间复杂度:O(n)(需要临时数组)
  • 3. 特点
    • o 稳定排序
    • o 适合链表排序
    • o 需要额外空间

    快速排序(Quick Sort)

    1. 1. 分治策略
    • o 选择基准元素(pivot)
    • o 分区:将小于基准的放在左侧,大于基准的放在右侧
    • o 递归排序左右分区
  • 2. 时间复杂度
    • o 最优/平均:O(n log n)
    • o 最差:O(n^2)(当数组已排序时)
    • o 空间复杂度:O(log n)(递归栈)
  • 3. 特点
    • o 不稳定排序
    • o 通常比归并排序快(常数因子更小)
    • o 原地排序(不需要额外空间)

    测试输出:

    Original array:
    12 11 13 5 6 7

    Sorted with MergeSort:
    5 6 7 11 12 13

    New array for QuickSort:
    10 7 8 9 1 5

    Sorted with QuickSort:
    1 5 7 8 9 10

    这两个实现都使用了泛型,支持任何实现了 IComparable<T> 接口的数据类型,并通过 Lomuto 分区方案实现了快速排序。


    相关推荐

    驱动网卡(怎么从新驱动网卡)
    驱动网卡(怎么从新驱动网卡)

    网卡一般是指为电脑主机提供有线无线网络功能的适配器。而网卡驱动指的就是电脑连接识别这些网卡型号的桥梁。网卡只有打上了网卡驱动才能正常使用。并不是说所有的网卡一插到电脑上面就能进行数据传输了,他都需要里面芯片组的驱动文件才能支持他进行数据传输...

    2026-01-30 00:37 liuian

    win10更新助手装系统(微软win10更新助手)

    1、点击首页“系统升级”的按钮,给出弹框,告诉用户需要上传IMEI码才能使用升级服务。同时给出同意和取消按钮。华为手机助手2、点击同意,则进入到“系统升级”功能华为手机助手华为手机助手3、在检测界面,...

    windows11专业版密钥最新(windows11专业版激活码永久)

     Windows11专业版的正版密钥,我们是对windows的激活所必备的工具。该密钥我们可以通过微软商城或者通过计算机的硬件供应商去购买获得。获得了windows11专业版的正版密钥后,我...

    手机删过的软件恢复(手机删除过的软件怎么恢复)
    手机删过的软件恢复(手机删除过的软件怎么恢复)

    操作步骤:1、首先,我们需要先打开手机。然后在许多图标中找到带有[文件管理]文本的图标,然后单击“文件管理”进入页面。2、进入页面后,我们将在顶部看到一行文本:手机,最新信息,文档,视频,图片,音乐,收藏,最后是我们正在寻找的[更多],单击...

    2026-01-29 23:55 liuian

    一键ghost手动备份系统步骤(一键ghost 备份)

      步骤1、首先把装有一键GHOST装系统的U盘插在电脑上,然后打开电脑马上按F2或DEL键入BIOS界面,然后就选择BOOT打USDHDD模式选择好,然后按F10键保存,电脑就会马上重启。  步骤...

    怎么创建局域网(怎么创建局域网打游戏)

      1、购买路由器一台。进入路由器把dhcp功能打开  2、购买一台交换机。从路由器lan端口拉出一条网线查到交换机的任意一个端口上。  3、两台以上电脑。从交换机任意端口拉出网线插到电脑上(电脑设置...

    精灵驱动器官方下载(精灵驱动手机版下载)

    是的。驱动精灵是一款集驱动管理和硬件检测于一体的、专业级的驱动管理和维护工具。驱动精灵为用户提供驱动备份、恢复、安装、删除、在线更新等实用功能。1、全新驱动精灵2012引擎,大幅提升硬件和驱动辨识能力...

    一键还原系统步骤(一键还原系统有哪些)

    1、首先需要下载安装一下Windows一键还原程序,在安装程序窗口中,点击“下一步”,弹出“用户许可协议”窗口,选择“我同意该许可协议的条款”,并点击“下一步”。  2、在弹出的“准备安装”窗口中,可...

    电脑加速器哪个好(电脑加速器哪款好)

    我认为pp加速器最好用,飞速土豆太懒,急速酷六根本不工作。pp加速器什么网页都加速,太任劳任怨了!以上是个人观点,具体性能请自己试。ps:我家电脑性能很好。迅游加速盒子是可以加速电脑的。因为有过之...

    任何u盘都可以做启动盘吗(u盘必须做成启动盘才能装系统吗)

    是的,需要注意,U盘的大小要在4G以上,最好是8G以上,因为启动盘里面需要装系统,内存小的话,不能用来安装系统。内存卡或者U盘或者移动硬盘都可以用来做启动盘安装系统。普通的U盘就可以,不过最好U盘...

    u盘怎么恢复文件(u盘文件恢复的方法)

    开360安全卫士,点击上面的“功能大全”。点击文件恢复然后点击“数据”下的“文件恢复”功能。选择驱动接着选择需要恢复的驱动,选择接入的U盘。点击开始扫描选好就点击中间的“开始扫描”,开始扫描U盘数据。...

    系统虚拟内存太低怎么办(系统虚拟内存占用过高什么原因)

    1.检查系统虚拟内存使用情况,如果发现有大量的空闲内存,可以尝试释放一些不必要的进程,以释放内存空间。2.如果系统虚拟内存使用率较高,可以尝试增加系统虚拟内存的大小,以便更多的应用程序可以使用更多...

    剪贴板权限设置方法(剪贴板访问权限)
    剪贴板权限设置方法(剪贴板访问权限)

    1、首先打开iphone手机,触碰并按住单词或图像直到显示选择选项。2、其次,然后选取“拷贝”或“剪贴板”。3、勾选需要的“权限”,最后选择开启,即可完成苹果剪贴板权限设置。仅参考1.打开苹果手机设置按钮,点击【通用】。2.点击【键盘】,再...

    2026-01-29 21:37 liuian

    平板系统重装大师(平板重装win系统)

    如果你的平板开不了机,但可以连接上电脑,那就能好办,楼主下载安装个平板刷机王到你的个人电脑上,然后连接你的平板,平板刷机王会自动识别你的平板,平板刷机王上有你平板的我刷机包,楼主点击下载一个,下载完成...

    联想官网售后服务网点(联想官网售后服务热线)

    联想3c服务中心是联想旗下的官方售后,是基于互联网O2O模式开发的全新服务平台。可以为终端用户提供多品牌手机、电脑以及其他3C类产品的维修、保养和保险服务。根据客户需求层次,联想服务针对个人及家庭客户...