如图所示,cur指向数组第二个元素,prev指向数组第一个元素 ,用key记录基准元素。
算法过程简述:
1. cur找到比key小的值,prev++,cur和prev位置的值交换,cur++
2. cur找到比key大的值,cur++
3. 当cur++到大于数组长度,prev位置的值和key交换,此时一趟快排结束
4. 同上,分别递归左区间 QuickSort(a, begin, prev - 1); 右区间 QuickSort(a, prev + 1, end);
总体来看就是把比key大的值往右移,比key小的值移到左边。
详细过程如下:
完整代码:
#include<stdio.h>
void swap(int* a, int* b)
{
int tmp = *b;
*b = *a;
*a = tmp;
}
void QuickSort(int* a, int left, int right)//前后指针法
{
if (left >= right)
{
return;
}
int begin = left;
int end = right;
int key = a[left];
int cur = left + 1;
int prev = left;
while (cur <= right)
{
if (a[cur] > key)
{
cur++;
}
else
{
prev++;
if (prev != cur)
{
swap(&a[cur], &a[prev]);
}
cur++;
}
}
a[left] = a[prev];
a[prev] = key;
QuickSort(a, begin, prev - 1);
QuickSort(a, prev + 1, end);
}
int main()
{
int a[] = { 6,1,2,7,9,3,4,5,10,8 };
QuickSort(a, 0, sizeof(a) / sizeof(int)-1); //快慢指针
int i = 0;
for (i = 0; i < sizeof(a) / sizeof(int); i++)
{
printf("%d ", a[i]);
}
printf("\n");
return 0;
}