普通快排与随机快排的世纪大战

点击上方“算法与数据之美”,选择“置顶公众号”

更多精彩等你来!

算法一直是计算机学科中一个非常核心的内容,学习大黑书可以让我们年轻人得到充沛的力量(也就是少点头发),在程序的海洋里快乐徜徉。

排序算法是算法之中一个既基础又核心的内容,而快速排序则是比较排序中的佼佼者。今天我们就一起来探究一下快速排序。

普通快速排序

快速排序是一个经典的分治算法,解决分治问题的三个步骤就是 分解、解决、合并。

拆开来看看快速排序的基本思想:

分解 :将输入数组A[l..r]划分成两个子数组的过程。选择一个p,使得A被划分成三部分,分别是A[l..p-1],A[p]和A[p+1..r]。并且使得A[l..p-1]中的元素都小于等于A[p],同时A[p]小于等于A[p+1..r]中的所有元素。

解决:递归调用快速排序,解决分解中划分生成的两个子序列的排序。

合并:因为子数组都是原址排序的,所以无需进行合并操作,数组A[p..r]已经有序。

算法导论书上给出了简单易懂的伪代码,我在这直接给出Python的实现代码

def Quick_Sort(A,p,r):
    if p<r:
        q=Partition(A,p,r)
        Quick_Sort(A,p,q-1)
        Quick_Sort(A,q,r)

def Partition(A,p,r):
    x=A[r]
    i=p-1
    for j in range(p,r):
        if A[j]<=x:
            i+=1
            A[i],A[j]=A[j],A[i]
    A[i+1],A[r]=A[r],A[i+1]
    return i+1

这里看到数组的划分是直接选择了子数组的最后一个元素,那么当待排序列已经有序时,划分出的子序列便有一个序列是不含任何元素的,这使得排序的性能变差。为了改善这种情况,我们可以选择引入一个随机量来破坏有序状态。

快速排序的随机化版本

我们可以通过在选择划分时随机选择一个主元来实现随机快速排序。仅需对上述代码做出小小的改动。

def Quick_Sort_Random(A,p,r):
    if p<r:
        q=Partition1(A,p,r)
        Quick_Sort(A,p,q-1)
        Quick_Sort(A,q,r)

def Partition1(A,p,r):
    k=random.randint(p,r)
    A[k],A[r]=A[r],A[k]

    return Partition(A,p,r)

性能比较

是骡子是马我们拉出来溜溜,我对两种快排的性能做了一个简单的测试。首先是一定数量的随机序列,运行的时间单位为秒,下表中的结果是经多次运行所取得的平均值。

方法103
104
105
106
107
5*107
108
普通快排0.002045570.024539950.323358134.8364108463.91342704456.205160781176.27041785
随机快排0.002288480.032929490.397340495.4132348766.26046769451.385529991108.05737074

也可以使用可视化的方法将上表变得更加清楚,普通排序在数据量较小时具有一定的性能优势,随机快排可能是因为添加了随机选择这一项操作而影响了部分性能,但是随着数据量进一步增大,两者之间的性能会非常接近。

接下来是对有序序列进行测试,

方法103
104
105
106
普通快排0.06262696///
随机快排0.034402280.451898777.2805512095.54553382

普通快排在数据量非常小的时候就把栈给挤爆喽,从另一侧面反映出随机快排的必要性,在处理比较极端也就是完全有序的序列时具有较大的优势。

今天的分享就到这里啦,Bye~

提前祝大家

元旦快乐

2020 红红火火~

 

   

编程到底难在什么地方?

S2云顶夺魁助手一键配置!

纯前端实现人脸识别自动佩戴圣诞帽

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。、可私 6信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 、可私信6博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值