实现一:
void quicksort(int number[], int left, int right)
{
int i, j, s;
if(left < right)
{
s = number[(left + right) / 2];
i = left -1;
j = right + 1;
while(1)
{
while(number[++i]<s);
while(number[--j]>s);
if(i>=j) break;
swap(number[i], number[j]);
}
quicksort(number, left, i-1);
quicksort(number, i+1, right);
}
}
实现二:
void quickSort(int a[], int p, int r)
{
if (p < r)
{
int q = partition(a, p, r);
quickSort(a, p, q - 1);
quickSort(a, q + 1, r);
}
}
int partition(int a[], int p, int r)
{
int key = a[r];
int i = p - 1;
int j = p;
//使a[p]到a[i]都是小于a[r]的数,a[i+1]到a[j]都是大于a[r]的数
for (; j < r; j++)
{
if (a[j] < a[r])
{
i++;
swap(a[i], a[j]);
}
}
swap(a[i + 1], a[r]);
return i + 1;
}
该算法可能有点不太容易理解,主要在于两个游标 i 和 j ,其实 j 是用来从 p 到 r 的一个遍历,i 是用来标记最后一个小于 a[r] 的数,也就是说在上述遍历过程,始终保持着 i 左边(包括 a[i] )的值小于 a[r],i 右边的值大于等于 a[r]。
欢迎各位高人跟帖,晒出更好的程序!