您的位置:首页 > 其它

快速排序个人理解

2015-04-19 11:36 239 查看
这段时间刚粗略的看完了算法导论,主要是为找工作做准备,因为初看程序员面试类书籍的时候,发现算法这块很重要。(建议大家看一本书的最好是在一两个星期内看完,因为像算法导论这些很厚又比较难的书,会越拖越不想看)

今天重点理解快速排序算法,希望大家互相交流,互相学习,加深理解。

首先,快速排序是原址排序。这点一直挺困惑,不知道原址具体是什么意思,书中定义是:在排序算法中,如果输入数组中仅有常数个元素需要在排序过程中存储在数组之外,则称排序算法是原址的。我的个人理解是:在排序一个数组是,数组每次排序结果仍然在原数组里,即是对原数组的更新,就像快速排序算法一样,对数组A[p..q-1]和数组A[q+1..r]进行排序后,不需要合并操作数组A[p..r]就已经有序了。

然后就是快速排序算法的个人理解。首先,快速排序与归并排序一样使用了分治思想。

分解:将数组A[p..r]划分为两部分A[p..q-1]和数组A[q+1..r],其中A[p..q-1]中的每个元素都小于等于A[q],A[q+1..r]中的每个元素都大于等于A[q]。其中A[q]是通过划分部分过程计算出的。

解决:通过递归调用快速排序,对数组A[p..q-1]和数组A[q+1..r]进行排序。

合并:正如上面所说,因为快速排序是原址排序,所以不需要合并,A[p..r]就已经有序了。

下面的代码实现快速排序:

QUICKSORT(A,p,r)
if(p<r)
q=PARTITION(A,p,r)
QUICKSORT(A,p,q-1)
QIUCKSORT(A,q+1,r)


如果是排序数组A中的全部元素,那么初始调用为QUICKSORT(A,1,A.length)。

说到底,快速排序最后两行代码就是递归调用快速排序算法,第一次计算出q值,然后将数组划分为左右两部分,然后又对左右两部分分别进行快速排序,就这样一直循环,直到最终就剩下一个元素,这就像一棵树,一层一层向下。

算法的关键部分就是PARTITION过程,划分数组。

PARTITION(A,p,r)
x=A[r]     //书中的方法是选取数组A[p..r]中的A[r]作为主元
i=p-1
for j=p to r-1
if A[j]<=x
i=i+1
exchange A[i] with A[j]
exchange A[i+1] with A[r]
return i+1


这部分大家可以在看算法导论快速排序章节的具体介绍。或者可以看麻省理工网易公开课,这里边是将A[p]作为主元。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法导论