双向扫描法

77 篇文章 12 订阅
24 篇文章 1 订阅

双向扫描法
思路:头尾指针从两端往中间扫描,从左找到大于主元的元素,从右找到小于等于主元的元素二者交换,继续扫描,直到左侧的元素都大于等于右侧的元素。
1.一般以第一个元素作为主元(基准),左指针指向第二个元素,右指针指向最后一个元素,左指针指向的元素要是小于或等于主元,继续向右扫描,右指针指向的元素大于主元,所在位置元素保持不变,继续向左扫描。
在这里插入图片描述2.当左指针指向的元素大于主元,与右指针此时指向的元素做交换,一直这样重复
在这里插入图片描述3,.当左指针和右指针相遇,且左指针指向大于等于主元的元素,右指针指向小于等于主元的元素,此时扫描结束
在这里插入图片描述4.两者交错,且right指向的是 最后一个小于等于主元的位置,也就是主元应该呆的位置
5.还需要考虑若是左边的元素全部都小于主元,防止指针溢出

伪代码-----单向扫描

quickSort
q=partition(A,p,r)
quickSort(A,p,q+1)
quickSort(A,q+1,r)

parttition(A,p,r)
pivot=A[p]   //主元为数组首元素 
sp=p+1   //扫描指针 
bigger=r  //右指针
while(sp<=bigger)
if(A[sp]<=pivot)  //扫描指针小于等于主元 
sp++  //指针继续向右扫描 
else 
swap(A,sp,bigger)  //扫描元素大于主元 ,两指针交换,右指针左移
bigger--
swap(A,p,bigger)
return bigger

伪代码------双向扫描

partition2(A,p,r){
	pivot=A[p];  //主元 
	left=p+1;   //左指针指向第二个元素 
	right=r;   //右指针指向最后一个元素 
	while(A[left]<=pivot){   //当左指针元素小于右指针元素
	//左指针不停的向右走 ,直到遇到大于主元的元素 
		while(left<=right&&A[left]<=pivot)
		left++ //循环退出时,left一定是指向第一个大于主元的位置 
	     while(left<=right&&A[right>=pivot])
		 right--  //循环退出时,right一定是指向一个小于主元的位置 
		  swap(A,p,right); 
	}
	//while退出时,两者交错,且right指向的是 最后一个小于等于主元的位置,也就是主元应该呆的位置 
    swap(A,p,right);
	return right; 
} 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值