-
1、定义两个指针prev和cur,分别指向left和left+1。
-
2、定义一个变量keyi,用于保存基准值的下标,初始值为left。
-
3、进入一个循环,循环条件是cur <= right,即cur指针没有越界。
-
4、在循环中,如果a[cur]小于基准值a[keyi],则将prev指针右移一位,并交换a[prev]和a[cur]的值,保证prev指针之前的元素都小于基准值。
-
5、将cur指针右移一位。
-
6、重复步骤4到步骤6,直到cur指针越界。
-
7、最后,将基准值a[keyi]和a[prev]交换位置,将基准值放在正确的位置上。
-
8、返回分割点的下标prev。
同样实现了将数据分成两部分,左边的元素都小于等于基准值,右边的元素都大于基准值。
代码:
int PartSort3(int* a, int left, int right)
{
//三数取中优化
//int midi = NumBers(a, left, right);
//Swap(&a[left], &a[midi]);
int prev = left;
int cur = prev + 1;
int key = left;
while(cur <= right){
if(a[cur]< a[key] && ++prev != cur){
Swap(&a[prev],&a[cur]);
}
cur++;
}
Swap(&a[prev],&a[key]);
return prev;
}