快速排序的思想:通过定位一个轴值,分别使用两个指针从向前向后找到比轴值大的数字,和从后向前找到比轴值小的数字,交换指针上的数字,直到两个指针相遇。此时在相遇处左边的值都小于轴值,右边的值都大于轴值,于是把轴值与这个位置上(左指针指向)的值交换位置,此时轴值在这个序列中的位置也就定下来了!接着就分别对轴值左边的序列和右边的序列再次应用这个方法直到整个序列都是有序的。
快速排序的步骤!!!
1定位轴值pivot,最好随机取一个轴值以避免原序列已经有序的情形,也可以直接选择序列中间的位置的值作为轴值(暂时使用这一种)
2.将轴值与最后一个元素交换位置(不是必要的,但是实现起来方便)
3.将左指针从第0个位置开始向右扫描直到遇到比轴值大的位置停下,接着右指针从n-1的位置开始向前扫描直到遇到一个比轴值小的位置停下,交换左右指针上位置的值。
4循环第三步直到某一次交换之后,发现左指针已经位于右指针的右边了!于是将最后一次交换恢复(不必要的交换已经发生后的恢复)并退出循环,返回左指针停下的位置(也就是右序列的第一个值)
5.将位于序列最后轴值与左指针所指的元素交换位置(该元素为左指针所停下的位置,因此也是属于比轴值大的值),此时轴值的位置就定下来了。
6.对左序列递归使用此方法
7.对左序列递归使用此方法
partition的C++实现关键
do{
while(Comp::lt(A[++l],pivot));
while((r!=0)&&Comp::gt(A[--r],pivot));
swap(A ,l,r);————不断定位与交换
}while(l<r);
swap(A,l,r);—————恢复最后一次不必要交换
return l;
quickSort的C++实现关键
qucikSort(A ,i,j)————数组,最左,最右
if(j<=i)return;————不比较一个或0个元素的数组
int pivotindex = findpivot(A,i,j);
swap(A,pivotindex,j);————将pivot放到数组最末尾
int k = partition(A,i-1,j,A[j]);————返回做指针
swap(A,k,j);——————定位轴值正确位置!
qucikSort(A ,i,k-1);
qucikSort(A ,k+1,j);