双向扫描法
思路:头尾指针从两端往中间扫描,从左找到大于主元的元素,从右找到小于等于主元的元素二者交换,继续扫描,直到左侧的元素都大于等于右侧的元素。
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;
}