RT,代码如下;
//快排三路划分,解决大量重复元素问题
int Partition_3(int A[], int low , int high) {
//low,high移动指针;left,right保存左右边界
int i,j,left,right;
left = i = low;
j = high;
int pivot = A[low];//第一个为枢轴元素
while (low < high) {
while (low<high && A[high]>=pivot) {
if(A[high]==pivot){
swap(A[high],A[j]);
j--;
}
high--;
}
A[low] = A[high];
while (low<high && A[low]<=pivot) {
if(A[low]==pivot){
swap(A[low],A[i]);
i++;
}
low++;
}
A[high] = A[low];
}//最终low和high相遇,三个指针将数组分成3部分:
//left->i(左边和pivot相等的元素);
//i->low(high)(比pivot小的元素);
//low(high)->j(比pivot大的元素);
//j->right(右边和pivot相等的元素);
//执行交换,将等于pivot的元素全部放到中间(类似数组循环移位)
int a,b;
for (a=i,b=low;a<(i+low)/2;a++){swap(A[a],A[b]);}
for (a=left,b=low;a<(left+low)/2;a++){swap(A[a],A[b]);}//左边换完
for (a=low,b=j;a<(low+j)/2;a++){swap(A[a],A[b]);}
for (a=low,b=right;a<(low+right)/2;a++){swap(A[a],A[b]);}//右边换完
return low;
}