快速排序个人理解

这段时间刚粗略的看完了算法导论,主要是为找工作做准备,因为初看程序员面试类书籍的时候,发现算法这块很重要。(建议大家看一本书的最好是在一两个星期内看完,因为像算法导论这些很厚又比较难的书,会越拖越不想看)
今天重点理解快速排序算法,希望大家互相交流,互相学习,加深理解。
首先,快速排序是原址排序。这点一直挺困惑,不知道原址具体是什么意思,书中定义是:在排序算法中,如果输入数组中仅有常数个元素需要在排序过程中存储在数组之外,则称排序算法是原址的。我的个人理解是:在排序一个数组是,数组每次排序结果仍然在原数组里,即是对原数组的更新,就像快速排序算法一样,对数组A[p..q-1]和数组A[q+1..r]进行排序后,不需要合并操作数组A[p..r]就已经有序了。
然后就是快速排序算法的个人理解。首先,快速排序与归并排序一样使用了分治思想。

  1. 分解:将数组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]是通过划分部分过程计算出的。
  2. 解决:通过递归调用快速排序,对数组A[p..q-1]和数组A[q+1..r]进行排序。
  3. 合并:正如上面所说,因为快速排序是原址排序,所以不需要合并,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]作为主元。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值