- 从数列中挑出一个元素,称为 “基准”(pivot);
- 重新排序数列,所有元素比基准值小的摆放在基准前面,所有元素比基准值大的摆在基准的后面(相同的数可以到任一边)。在这个分区退出之后,该基准就处于数列的中间位置。这个称为分区(partition)操作;
- 递归地(recursive)把小于基准值元素的子数列和大于基准值元素的子数列排序
代码:
void QuickSort(int A[],int low,int high)
{
if(low<high) //递归出口
{
int local=Partition(A,low,high);
QuickSort(A,low,local-1);
QuickSort(A,local+1,high);
}
}
/*函数功能:对数组进行划分,使选中的枢轴pivot到达最终位置local,数组左边的都小于pivot,数组右边的都大于pivot
**返回值 :返回值为int,是枢轴的最终位置local
**函数参数:待处理子数组以及其左右边界
*/
int Partition(int A[], int low, int high)
{
int pivot=A[low]; //将当前表中的第一个数设置为枢轴(可选其他的设置方式)
while(low<high)
{
while(low<high && A[high]>=pivot) high--; //从后向前查找比枢轴小的元素,并移动到枢轴前面
A[low]=A[high];
while(low<high && A[low]<=pivot) low++; //从前向后查找比枢轴大的元素,并移动到枢轴后面
A[high]=A[low];
}
A[low]=pivot; //将枢轴放到最终位置
return low;
算法分析
最佳情况:T(n) = O(nlogn) 最差情况:T(n) = O(n2) 平均情况:T(n) = O(nlogn)