天天看点

快排三路划分

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;
}
           

继续阅读