2020-08-19

排序算法之快速排序------算法分析

  对于包含n个数的输入数组来说,快速排序是一种最坏情况时间复杂度为Θ(n 2) 的排序算法,然而快速排序通常是实际排序中最好的选择,因为它的平均性能非常好,它的期望时间复杂度为Θ(nlgn),而且实际Θ(nlgn)中隐含的常数因子非常小,另外该算法是原址排序,很好地节省了内存空间。快速排序算法的运行情况比较复杂,与归并排序一样,快速排序也运用了分治思想,下面是对数组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]进行排序。

  合并:因为是原址排序,所以当递归过程结束后数组已经完成排序,不需要合并。

  下面为程序实现快速排序

QUICKSORT(A,p,r)
 if(p<r)
  q=PARTINTION(A,p,r)
  QUICKSORT(A,p,q-1)
  QUICKSORT(A,q+1,r)
return A
   其中划分子过程的代码如下,这是快速排序算法的核心。
PARTINTION(A,p,r)
 i=p-1
 for j=p to r-1
  if A[j]<=A[r]
   i=i+1
   exchangeA[j] with A[i]
exchange A[i+1] with A[r]
return i+1
  在以上的划分子过程PARTINTION中,我们把A[p,r]划分为四个部分,第一部分A[p,i]这部分的元素值都小于等于A[r],第二部分为A[i+1,j-1],这部分的元素值都大于A[r],第三个部分为A[j,r-1]这部分的元素大小与A[r]的关系不能确定,第四部分为A[r]作为参照主元。
  划分子过程结束时四个部分变为三个部分,同时将主元的值置换到中间,并返回下标作为q的值。下面以数组2,8,7,1,3,5,6,4的PARTINTION执行过程给出了一个例子

21347568
21387564
21783564
28713564

  执行完成后返回的下标值为4所在的位置,同时以4为分界。将数组划分成了3个部分。在递归执行QUICKSORT的过程中,完成了原址排序。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值