快排三路划分

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


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值