快速排序算法(二):切分方法
对于切分方法的实现,一般的方法是随机取出a[lo]作为切分元素,也就是上一篇文章中提到的’K’,然后我们从数组的左端开始向右扫描直到找到一个不小于它的元素,同样道理,再从数组的右端开始向左扫描直到找到一个不大于的元素。然后再将这两个元素交换位置,如此这样继续,这样就保证了’K’左边的元素从整体上来看是不大于’K’右边的元素。当两个指针相遇时,我们只需要将切分元素a[lo]和左子数组最右侧的元素交换,然后返回最右侧元素的下标(也即是元素的位置)即可。
切分排序算法(摘自算法第四版–快速排序)
private static int partition(Comparable[] a,int lo,int hi)
{
int i=lo;
int j=hi+1;
Comparable v=a[lo];//切分元素
while(true)
{
//扫描左右
while(less(a[++i],v))
{
if(i==hi)
break;
}
while(less(v,a[--j]))
{
if(i==lo)
{
break;
}
}
if(i>=j)
{
break;
}
exch(a,i,j); //交换值
}
exch(a,lo,j);//将v放入正确的位置
return j; //v左边的元素整天不大于左边的元素
}