快速(二分法)排序的思想是将数组划分为两边,以某个节点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;
}
}
}