3.前后指针快排序
int partsort3(int *a, int begin, int end)
{
int key = begin;
int prev, cur;
prev = begin;
cur = begin + 1;
while (cur <= end)
{
if (a[cur] < a[key] && ++prev != cur)
{
Swap(&a[cur], &a[prev]);
}
cur++;
}
Swap(&a[key], &a[prev]);
key = prev;
return key;
}
void quicksort(int *a, int begin, int end)
{
if (begin >= end)
{
return;
}
int key = partsort3(a, begin, end);
quicksort(a, begin, key - 1);
quicksort(a, key + 1, end);
}
例如 6,1,2,7,9,3,4,5,10,8
初始时
prev指向6,cur指向1,key指向6
cur的数比key的数小,prev往后移动一个位置
因为此时prev与cur位置相同,不做操作。
cur接着往后走一步,指向2比6小,所以prev也往后走一步,此时cur和prev仍然指向同一位置,不做操作。
cur接着往后走,此时cur指向7比6大,prev原地不动。
cur继续往后走,此时cur指向9比6大,prev原地不动。
cur继续往后走,此时cur指向3比6小,prev往后走一步,由于cur和prev位置不同,所以进行数字交换。
交换后,此时prev指向的是3,cur指向的是7
接着cur继续往后走,此时cur指向4小于6,prev往后也走一步,cur与prev位置不同,进行数字交换
交换后,cur继续往后走,此时指向5小于6,prev往后走一步,进行两数交换。
交换后cur继续往后走,由于后面的数都比6大,所以当cur离开此数组时,prev仍然指向5。
当cur离开时,此时交换prev与key位置上的数
此时结果如下,prev指向的是6。
此时即完成了一次排序并放回prev的下标,接着利用递归,分别对5,1,2,3,4和9,7,10,8重复上述方法对排序。
最终结果即为升序。