C# 快速(二分法)排序

快速(二分法)排序的思想是将数组划分为两边,以某个节点v为界(设这个节点的值为 v),在节点v左边的所有元素都小于 v, 在节点v右边的所有元素都大于v.

这样不停地划分,到最后整个数组就是有序的了。

具体分成两边的思路为(起始下标为start, 结束下标为 end):

选择v = a[end]作为中介点

先从start开始扫描,遇到a[++i] < v停下来,接着从end开始扫描a[--j] > v停下来,交换a[i]和a[j]

接着从i+1开始扫描,另一边接着从j-1开始扫描。注意边界条件if (i >= j) break; 扫描完成后就找到了v应该放得位置,交换Swap(ref a[i], ref a[end]);这样就完成了一次划分。

该算法的平均时间复杂度为nLgn,最坏的情况是n的平方。该算法适合使用于大数据量的排序:

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace QuickSort { class Program { static void Main(string[] args) { int[] a ={1,6,4,3,8,5,21,9,31,81,101,55,62, 151, 7,2,10}; quicksort(a, 0, a.Length-1); for (int i = 0; i < a.Length; i++) { Console.WriteLine(a[i]); } Console.Read(); } static void quicksort(int[] a, int start, int end) { int i; if (end - start == 1) { if (a[start] > a[end]) { Swap(ref a[start], ref a[end]); } return; } if (end - start == 0) { return; } i = partition(a, start, end); if (i > start) { quicksort(a, start, i - 1); } if (i < end) { quicksort(a, i + 1, end); } } static int partition(int[] a, int start, int end) { int i = start-1; int j = end; int v = a[end]; for (; ; ) { while (i < end && a[++i] < v) ; while (j > start && a[--j] > v) ; if (i > = j) break; Swap(ref a[i], ref a[j]); } Swap(ref a[i], ref a[end]); return i; } static void Swap(ref int a, ref int b) { int temp = a; a = b; b = temp; } } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值