C#:快速排序

1. 介绍

快速排序是一种非常高效的排序算法,它采用“分而治之”的思想,把大的拆分为小的,小的再拆分为更小的。

其原理如下:
对于一组给定的记录,通过一趟排序后,将原序列分为两部分,其中前一部分的所有记录均比后一部分的所有记录小,然后再依次对前后两部分的记录进行快速排序,递归该过程,直到序列中的所有记录均有序为止。

具体而言,算法步骤如下:

  1. 分解:将输入的序列array[m..n]划分成两个非空子序列array [m…k]和array [k+1…n],使array [m…k]中任一元素的值不大于array [k+1…n]中任一元素的值。
  2. 递归求解:通过递归调用快速排序算法分别对array [m…k]和array [k+1…n]进行排序。
  3. 合并:由于对分解出的两个子序列的排序是就地进行的,所以在array [m…k]和array [k+1…n]都排好序后不需要执行任何计算array [m…n]就已排好序。

2. 排序过程

以数组{ 5, 4, 9, 8, 7, 6, 0, 1, 3, 2 }为例。排序过程如下:

  • 取第一个值为基准值,即5。
  • i为下标,从左向右移。
  • j为下标,从右向左移。
5498760132
ij

从j开始,j数组值为2,<5,所以应该放到左边,赋值给当前i的值,i右移一位。

2498760132
ij

i数组值为4,<5,所以位置不变,i再右移一位。

2498760132
ij

i数组值为9,>5,所以应该放到右边,赋值给当前j的值,j向左移一位。

2498760139
ij

j数组值为3,<5,所以应该放到左边,赋值给当前i的值,i向右移一位。

2438760139
ij

i数组值为8,>5,所以放到右边,赋值个当前j的值,j向左移一位。

2438760189
ij

j数组值为1,<5,所以放到左边,赋值给当前i的值,i右移。

2431760189
ij

i数组值为7,>5,放右边,j左移。

2431760789
ij

j数组值为0,<5,放左边,i右移。

2431060789
ij

i数组值为6,>5,放右边,j左移。

2431066789
i,j

这时,i和j已经相等,跳出移动循环,把基准值赋给i数组值。

第一趟排序之后,数组就为{ 2, 4, 3, 1, 0, 5, 6, 7,8,9 }。
第二趟排序的话就会分成两组,即{2,4,3,1,0}和{5,6,7,8,9 },继续这样排,直到不能排为止。

3. 程序代码

程序如下:

 
static void Main(string[] args)
{
int i = 0;
int[] a = { 5, 4, 9, 8, 7, 6, 0, 1, 3, 2 };
int len = a.Length;
quickSort(a);
for (i = 0; i < len; i++)
{
Console.WriteLine(a[i] + "");
}
}
public static void quickSort(int[] array)
{
sort(array, 0, array.Length - 1);
}
/// <summary>
/// 排序
/// </summary>
/// <param name="array">需要排列的数组</param>
/// <param name="low">低位</param>
/// <param name="high">高位</param>
static void sort(int[] array, int low, int high)
{
if (low >= high)
{
return;
}
// 基准值 选取当前数组第一个值
int index = array[low];
// 低位i从左向右扫描
int i = low;
// 高位j从右向左扫描
int j = high;
while (i < j)
{
while (i < j && array[j] >= index)
{
j--;
}
if (i < j)
{
array[i] = array[j];
i++;
}
while (i < j && array[i] < index)
{
i++;
}
if (i < j)
{
array[j] = array[i];
j--;
}
}
array[i] = index;
// 左边的继续递归排序
sort(array, low, i - 1);
// 右边的继续递归排序
sort(array, i + 1, high);
}

本文来自博客园,作者:一纸年华,转载请注明原文链接:https://www.cnblogs.com/nullcodeworld/p/16749326.html

  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速排序(Quick Sort)是一种基于比较的排序算法,它的时间复杂度为O(nlogn),常用于对数组进行排序。 以下是 C# 语言实现快速排序的示例代码: ```csharp using System; class QuickSort { static void Main(string[] args) { int[] arr = { 5, 2, 8, 6, 3, 7, 1, 4 }; Console.WriteLine("Original Array:"); PrintArray(arr); QuickSortAlgorithm(arr, 0, arr.Length - 1); Console.WriteLine("\nSorted Array:"); PrintArray(arr); } static void QuickSortAlgorithm(int[] arr, int left, int right) { if (left < right) { int pivotIndex = Partition(arr, left, right); QuickSortAlgorithm(arr, left, pivotIndex - 1); QuickSortAlgorithm(arr, pivotIndex + 1, right); } } static int Partition(int[] arr, int left, int right) { int pivot = arr[right]; int i = left - 1; for (int j = left; j <= right - 1; j++) { if (arr[j] < pivot) { i++; Swap(ref arr[i], ref arr[j]); } } Swap(ref arr[i + 1], ref arr[right]); return i + 1; } static void Swap(ref int a, ref int b) { int temp = a; a = b; b = temp; } static void PrintArray(int[] arr) { foreach (int element in arr) { Console.Write(element + " "); } } } ``` 程序输出: ``` Original Array: 5 2 8 6 3 7 1 4 Sorted Array: 1 2 3 4 5 6 7 8 ``` 在上面的代码中,`QuickSortAlgorithm` 函数递归地调用自身,直到排序完成。`Partition` 函数选择数组的最后一个元素作为主元(pivot),并将比主元小的元素交换到左侧,比主元大的元素交换到右侧,然后返回主元的下标。 `Swap` 函数用于交换数组中两个元素的值。 最后,`PrintArray` 函数将数组打印出来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值