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

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

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

字数 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 分区方案实现了快速排序。


    相关推荐

    设置无线网密码步骤(如何设置无线网络wifi密码)

    首先使用已经连接到网络的手机或电脑,在浏览器地址栏输入192.168.1.1或者192.168.0.1;输入管理员账号和密码,两个一般都是输入admin;点击【无线设置】,进入【安全选项】,在输入旧密...

    下载优酷官方正版(下载优酷官方正版网站)

    您好,直接打开浏览器或者打开手机的应用商城,然后输入该软件的名称然后搜索即可在搜索结果中下载安装即可,也可以下载一个市场类软件,常见的有安卓市场,机锋市场等,之后使用此款软件下载其他程序。优酷视频...

    iso文件安装器(iso安装程序)

    不能。苹果手机是不能安装apk格式软件的,apk是安卓系统的安装包格式。通过将APK文件直接传到Android模拟器或Android手机中执行即可安装。apk文件和sis一样,把androidsdk...

    台式电脑重装系统按哪个键进入
    台式电脑重装系统按哪个键进入

    不同品牌的设备按键是不同的1、如果原来电脑装一键还原软件,装系统时直接在启动画面选择重新恢复系统项即可;2、如需启动光盘或者优盘来重装系统,需要开机按启动热键,选择对应的按键即可调出启动菜单选择界面,在菜单中选择优盘或光驱,按回车,按提示进...

    2025-12-22 17:55 liuian

    戴尔笔记本电脑一开机就蓝屏

    笔记本蓝屏可能是电脑硬盘故障,可以更换一个硬盘尝试。也可能是更新了驱动与修复漏洞补丁,可以进入安全模式将更新的驱动删除。有可能是内存条故障,可以把内存条取下来,用橡皮擦轻轻擦拭金手指,然后用毛刷将内存...

    优酷路由宝怎么设置(优酷路由宝怎么设置网络)

    无线连接如果准备用手机、笔记本电脑来设置优酷路由宝,需要先把WAN口,连接宽带网线(宽带猫、光猫);然后手机/笔记本电脑搜索连接到优酷路由宝的WiFi。优酷路由宝的默认WiFi名称是:Youku_开...

    一键装机软件大全(一键装机下载)

    1一键装机工具是一种自动化安装计算机操作系统以及常用软件的工具。2使用一键装机工具,需要先准备好需要安装的操作系统镜像和需要安装的软件列表,然后将它们放在一键装机工具所指定的位置。接下来,打开一键...

    home键是什么意思苹果手机(home键是苹果手机哪个键)

    就是手机屏幕正下方的那个圆形的按钮,就是苹果手机的home键,home键的作用比较大,可以用来设置指纹解锁,单机home键可以返回主屏幕界面,双击home键可以弹出后台应用程序可以进行清楚,还可以通过...

    tplink说明书图片(tp-link路由器说明书步骤图)

    第一步连接路由器WIFI在手机获取IP地址里找到路由器网关地址,第二步在浏览器地址栏输入路由器网关地址,之后会跳转到路由器管理员登录界面,输入账号密码就可以进入路由后台管理路由,如果提示路由器密码错误...

    如何不安装flash玩4399(现在4399不提供flash如何玩游戏)

    没有flash是玩不了的,需要开启flash才可以。1、首先打开浏览器,进入4399的游戏页面。2、进入游戏页面后,点击【已被屏蔽】文字。3、然后右上角会出现窗口,点击【管理】按钮。4、进入管理页面后...

    chrome download apk(chromedownloadapk in english)

    手机下载安装的第三方应用出现问题,无法正常使用,建议按照以下方法操作:1.关闭重新启动该应用。2.建议将此软件卸载重新安装尝试。3.更换其他版本尝试。4.更新下手机系统版本后安装尝试5.备份手机数据(...

    qq空间官网手机登录网页版(qq空间官网登陆入口)
    qq空间官网手机登录网页版(qq空间官网登陆入口)

    z.qq.com可以通过以下方式登录手机QQ空间:1、使用手机登录手机腾讯网3g.qq.com,点击“空间”,根据提示QQ号码和QQ密码就可以登录;2、通过手机直接输入手机QQ空间网址z.qq.com,根据提示操作即可登录;3、下载手机Q...

    2025-12-22 13:55 liuian

    windows11我的电脑在哪里打开

    1/6通过“开始”进入“设置”-“时间和语言”。2/6在“时间和语言”界面选择“区域”3/6这里我们将区域更改位“新加披”,退出。4/6打开微软自带的市场,搜索“你的手机”获取并下载。5/6安装完成后...

    win10怎么取消开机自启动(win10如何关闭开机自动启动)

    要关闭Windows10的开机自动启动程序,你可以按下Win+R键,输入"msconfig"并按回车键打开系统配置工具。在"启动"选项卡中,你可以看到所有开机自动...

    手机cpu排名2025(手机cpu排名榜)

    一、2022手机CPU性能综合排名前八名手机CPU:1、型号:苹果A16---综合分数:暂无2、型号:骁龙8gen1---综合分数:42333、联发科天玑9000---综合分数:38724、...