快速排序
基本思想:从待排序元素中选取一个枢轴元素,将所有小于它的元素置于它前方,所有大于它的元素置于其后方,从而找到枢轴元素在有序数列中的位置,再分别对左右两边未排序数列进行同样的操作。
过程图示:
1.将low位置的元素存至pivot中
2.high指针前移,找到小于等于pivot的元素
3.将该元素放至low位
4.换low指针,前移,找到大于pivot的元素
5.将它放到high位
6.换high指针前移,重复之前过程,后续不再赘述
注:图中有空位是为理解方便,实际代码中无需将移动元素的原位置置空。
最终low,high指针将会相遇,此时low(high)的位置便是pivot在有序数列中的位置,将A[low] = pivot 即可。
实现:
int Partition(int A[],int low,int high)
{
int pivot = A[low]; //pivot枢轴元素
while (low < high)
{
while (low < high && A[high] >= pivot) --high;
A[low] = A[high];//从high开始往前寻找到一个比pivot小的元素,放到low的位置
while (low < high && A[low] <= pivot) ++low;
A[high] = A[low];//从low开始往前寻找到一个比pivot大的元素,放到high的位置
}//循环此过程直到low与high相遇
A[low] = pivot; //将pivot元素放在最终位置上
return low; //返回其位置
}
void QuickSort(int A[],int low,int high)
{
if(low < high)
{
int pos = Partition(A,low,high); //执行完此操作后pos位置的元素就不再动了
QuickSort(A,low,pos-1);
QuickSort(A,pos+1,high);
}
}