Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >普通快排与随机快排的世纪大战

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

作者头像
老肥码码码
发布于 2020-01-17 08:06:30
发布于 2020-01-17 08:06:30
67800
代码可运行
举报
运行总次数:0
代码可运行

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

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

普通快速排序

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

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

分解 :将输入数组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的实现代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

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

快速排序的随机化版本

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

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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.00204557

0.02453995

0.32335813

4.83641084

63.91342704

456.20516078

1176.27041785

随机快排

0.00228848

0.03292949

0.39734049

5.41323487

66.26046769

451.38552999

1108.05737074

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

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

方法

103

104

105

106

普通快排

0.06262696

/

/

/

随机快排

0.03440228

0.45189877

7.28055120

95.54553382

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

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

提前祝大家

元旦快乐

2020 红红火火~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 算法与数据之美 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
快速排序
快速排序是找出一个元素(理论上可以随便找一个)作为基准(pivot),然后对数组进行分区操作,使基准左边元素的值都不大于基准值,基准右边的元素值 都不小于基准值,如此作为基准的元素调整到排序后的正确位置。递归快速排序,将其他n-1个元素也调整到排序后的正确位置。最后每个元素都是在排序后的正 确位置,排序完成。所以快速排序算法的核心算法是分区操作,即如何调整基准的位置以及调整返回基准的最终位置以便分治递归。
用户2909867
2018/08/22
2610
快速排序(Python实现)
一、 算法介绍 快速排序是经常考查到的排序算法,这里对快排算法做一下总结。快速排序是“交换”类的排序,它通过多次划分操作实现排序!以升序为例,其执行流程可以概括为:每一趟排序选择当前所有子序列的一个关键字(通常是第一个)作为枢轴量,将子序列中比枢轴量小的移到枢轴前边,比枢轴大的移到枢轴后边,具体过程是一个交替扫描和交换的过程。当本趟所有子序列都被枢轴以上述规则划分完毕后会得到新的一组更短的子序列,它们会成为下一趟划分的初始序列集。 二、演示流程
全栈程序员站长
2022/07/22
6510
快速排序(Python实现)
一文读懂如何用 Python 实现6种排序算法
总结了一下常见集中排序的算法 归并排序 归并排序也称合并排序,是分治法的典型应用。分治思想是将每个问题分解成个个小问题,将每个小问题解决,然后合并。 具体的归并排序就是,将一组无序数按n/2递归分解成
CDA数据分析师
2018/02/05
9970
一文读懂如何用 Python 实现6种排序算法
一文读懂如何用 Python 实现6种排序算法
总结了一下常见集中排序的算法 归并排序 归并排序也称合并排序,是分治法的典型应用。分治思想是将每个问题分解成个个小问题,将每个小问题解决,然后合并。 具体的归并排序就是,将一组无序数按n/2递归分解
CDA数据分析师
2018/02/05
7930
一文读懂如何用 Python 实现6种排序算法
面试官:手写归并排序、快排能做到吗?我:小case!
我们可以认为在递归的过程当中,我们通过函数自己调用自己,将大问题转化成了小问题,因此简化了编码以及建模。
TechFlow-承志
2022/08/26
6140
面试官:手写归并排序、快排能做到吗?我:小case!
经典算法学习之------快速排序
本专栏为《手撕算法》栏目的子专栏:《经典算法》,会讲述一些经典算法,并进行分析。在此之前我们要先了解什么是算法,能够解决什么样的问题。
默 语
2024/11/20
890
经典算法学习之------快速排序
排序算法-下(Java语言实现)
的排序算法,归并排序和快速排序。这两种排序算法适合大规模的数据排序,比上一节讲的那三种排序算法要更常用。
acc8226
2022/05/17
4560
排序算法-下(Java语言实现)
10大常用的排序算法(算法分析+动图演示)
冒泡排序是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果它们的顺序错误就把它们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
Fivecc
2022/11/21
4200
10大常用的排序算法(算法分析+动图演示)
快排查找数组中的第K个最大元素
两种时间复杂度为O(nlogn)的排序算法,归并排序和快速排序。这两种排序算法适合大规模数据排序,更常用。
JavaEdge
2021/12/07
4.1K0
快排查找数组中的第K个最大元素
算法导论中的四种基本排序
                                                        by方阳
努力努力再努力F
2018/09/11
5800
算法导论中的四种基本排序
不同场景下 快速排序的几种优化方式你懂不?
苦逼的码农注:之前面试就被问过快速排序的优化,然而答的不好,所以关于快速排序的优化,还是要学一学啊。
帅地
2019/12/05
7930
不同场景下 快速排序的几种优化方式你懂不?
Go 语言算法之美—进阶排序
上一篇文章讲述了几种基础的排序算法,可以回顾一下:Go 语言算法之美—基础排序,这几种算法平均情况下的时间复杂度都是 O(n2),在大规模数据下是非常低效的,所以它们的应用并不多。
roseduan
2021/08/20
3490
递归与分治之快速排序
分治法就是把一个大问题分解为多个类型相同的子问题,最后把这些子问题的解合并起来就是问题的解。 快速排序(Quicksort)是对冒泡排序的一种改进,采用了分治的思想。 快排的基本思想: 通过一趟排序将要排序的数据分割成独立的两部分,其中一部分的所有数据都比另外一部分的所有数据都要小,然后再按此方法对这两部分数据分别进行快速排序,整个排序过程可以递归进行,当待排序列数据个数为1时,自然是有序的,以此达到整个数据变成有序序列。 具体算法步骤: 对于待排序列,在一趟排序前,从待排序列中随机选取一个数据作为枢轴量,
欠扁的小篮子
2018/04/11
8670
数据结构与算法 --- 排序算法(三)
上一篇数据结构与算法 --- 排序算法(二)中,介绍了分治算法思想及借助分治算法思想实现的归并排序。
Niuery Diary
2023/10/22
2640
数据结构与算法 --- 排序算法(三)
七大经典、常用排序算法的原理、Java 实现以及算法分析
大家好,我是多选参数的程序锅,一个正在 neng 操作系统、学数据结构和算法以及 Java 的硬核菜鸡。数据结构和算法是我准备新开的坑,主要是因为自己在这块确实很弱,需要大补(残废了一般)。这个坑以排序为开端,介绍了 7 种最经典、最常用的排序算法,分别是:冒泡排序、插入排序、选择排序、归并排序、快速排序、桶排序、计数排序、基数排序。对应的时间复杂度如下所示:
syy
2020/06/23
7420
46. 盘点那些必问的数据结构算法题之快速排序算法
快速排序也是基于分治模式,类似归并排序那样,不同的是快速排序划分最后不需要merge。对一个数组 A[p…r] 进行快速排序分为三个步骤:
用户11332765
2024/11/01
470
46. 盘点那些必问的数据结构算法题之快速排序算法
AI_第一部分 数据结构与算法(12.排序算法实战下)
第四阶段我们进行深度学习(AI),本部分(第一部分)主要是对底层的数据结构与算法部分进行详尽的讲解,通过本部分的学习主要达到以下两方面的效果:
python编程从入门到实践
2019/10/22
3630
AI_第一部分 数据结构与算法(12.排序算法实战下)
排序算法:快速排序
快速排序(Quicksort)是对冒泡排序的一种改进。 在实际中最常用的一种排序算法,速度快,效率高。
谙忆
2021/01/21
4460
为什么快速排序算法效率比较高?
快速排序算法是非常高效的一个排序算法,在众多的排序算法里面其无论在时间复杂度还是空间复杂度都是比较低的。因此作为一个程序员,我们很有必要学习和理解快排的原理。
我是攻城师
2018/09/30
9.6K0
为什么快速排序算法效率比较高?
重学数据结构和算法(五)之归并排序、快速排序
冒泡排序、插入排序、选择排序这三种排序算法,它们的时间复杂度都是 O(n2),比较高,适合小规模数据的排序。归并排序和快速排序的时间复杂度为 O(nlogn) 。这两种排序算法适合大规模的数据排序
六月的雨
2021/09/26
1.3K0
重学数据结构和算法(五)之归并排序、快速排序
相关推荐
快速排序
更多 >
领券
💥开发者 MCP广场重磅上线!
精选全网热门MCP server,让你的AI更好用 🚀
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验