参照了K&R在《C程序设计语言》里面的实现。
using System;
using System.Collections.Generic;
using System.Text;
namespace LuceneTest
{
class Test
{
static void Main(string[] args)
{
int[] array = { 32, 45, 12, 18, 25, 60, 53, 78, 99, 83,21,8,10,33,24,66,80,23,18,95,61 };
qsort(ref array,0,array.Length-1);
for (int i = 0; i < array.Length; i++)
{
Console.WriteLine(array[i]);
}
Console.Read();
}
public static void qsort(ref int[] v, int left,int right)
{
int i, last;
if (left >= right) return;
//交换第一个和中间的一个,为什么取中间的一个,因为可能数组已经排好序了,这样就是最好的情况。这句的主要作用就是选取比较数。
swap(ref v, left, (left + right) / 2);
last = left;//从左边开始一直到右边
for (i = left + 1; i <= right;i++ )
{
if (v[i] < v[left]) {
//如果比左边的小则交换位置,last累计交换次数,交换了多少次就说明有多少数比v[left]小。
swap(ref v,++last,i);
}
}
//交换原来的位置,使得v[last]分别是左右两边的中间数
swap(ref v,left,last);
qsort(ref v,left,last-1);
qsort(ref v,last+1,right);
}
public static void swap(ref int[] v,int i,int j)
{
int temp;
temp = v[i];
v[i] = v[j];
v[j] = temp;
}
}
}
更新(2008年1月27日):另外写了一个JavaScript版本的快速排序,思路和这个一样。