快速排序小记
快速排序是一种基于分治思想的算法。它的基本思想如下:
首先选取一个轴/基准(pivot),接着根据选取的轴进行分区操作(Partition),分区操作的结果是使待排序序列中小于轴值的元素全部位于轴的左边,大于轴值的元素全部位于轴的右边;这样就将整个序列分成了两个子序列,而轴值已经位于正确的位置.然后对轴左右两边的子序列分别递归地进行快速排序,最终得到一个有序的序列。
主要伪代码如下:
void Qsort(ElementType *p,int low,int high)
{
int pivot_location;
if(low<high) //需要排序的序列长度大于1
{
pivot_location=Partition(p,low,high); //首先将待排序序列一分为二
Qsort(p,low,pivot_location-1); //对轴左边的子序列递归运行Qsort
Qsort(p,pivot_location+1,high); //对轴右边的子序列递归运行Qsort
}
}
int Partition(ElementType *p,int low,int high) //
{
ElementType pivotkey;
pivotkey=p[low]; //用子序列的第一个元素作为轴
while(low<high)
{
while(low<high && p[high]>=pivotkey) //从右往左寻找第一个小于轴的元素
--high;
p[high] <-> p[low]; //与轴交换
while(low<high && p[low]<=pivotkey) //从左往右寻找第一个大于轴的元素
++low;
p[low] <-> p[high]; //与轴交换,此时,轴重新回到low位置
}
return low; //返回轴所在的位置
}
算法的平均时间复杂度:O(n logn),最坏情况下是:O(n2).具体的计算方法可以参考维基百科: http://zh.wikipedia.org/wiki/%E5%BF%AB%E9%80%9F%E6%8E%92%E5%BA%8F
志之所趋,无远勿届,穷山复海不能限也;志之所向,无坚不摧。