最近在看《剑指Offer》这本书,也在为找工作做一些准备,今天在书上看到排序在面试当中的重要性,所以下决心要好好搞一下
于是晚上回到实验室看了看《算法导论》中关于快速排序这一块的内容,作者讲的还是蛮详细的,后来借鉴网上的代码实现了一下,写下这篇文章,记录自己的学习过程。
快速排序是一种最坏情况时间复杂度为O(n2)的排序算法,虽然最坏情况时间复杂度很差,但是快速排序通常是在实际排序应用中最好的选择,因为它的平均性能非常好:它的期望时间复杂度是Ο(n log n) ,而且Ο(n log n) 中隐含的常数因子非常小。
最坏情况划分:当划分产生的两个子问题分别包含了n-1个元素和0个元素时,快速排序的最坏情况发生了。
下面是对一个典型的子数组A[p,r]进行快速排序的三步分治过程:
分解:数组A[p,r]被划分为两个子数组A[p,q-1]和A[q+1,r],使得A[p,q-1]中的每一个元素都小于等于A[q],而A[q]也小于等于A[q+1,r]中的每个元素。其中,计算下标q也是划分过程的一部分。
下面的程序实现快速排序:
QUICKSORT(A,p,r)
if p<r
q=PARTION(A,p,r);
QUICKSORT(A,p,q-1);
QUICKSORT(A,q+1,r);
下面是PARTION过程:
PARTITION(A,p,r)
x=A[r];
i=p-1;
for j=p to r-1
if(A[j] <= x)
++i;
swap(A[i],A[j]);
swap(A[i+1],A[r]);
return i+1;
下面就贴出代码吧,在VS2012下测试通过的