快速排序到底有多快?
上期为大家介绍了快速排序(Quicksort),有很多同学会问: 快排是不是比之前几种排序都要快?它到底有多快? ,那就让我们一起来做个小实验测试一下吧!
目前给大家介绍过了6种排序:冒泡排序、选择排序、
插入排序、希尔排序、归并排序、快速排序,并且在上期讲 快速排续 时给出了快排的优化方案:对于大数据集排序先使用 快排 ,当分区达到一定小的时候使用 插入排序 ,有同学就有疑惑:为什么当分区达到一定小时要用 插入排序 ,这样真的会变快吗?
冒泡排序、选择排序、插入排序、希尔排序、归并排序、快速排序
随机生成一个数据集,数据个数从10,100,1000依次递增到10万个
比较每个排序算法所用时长,多次测试,减少误差
首先对 随机数 进行排序,看看哪个排序方法较快;然后再对“ 基本有序 ”的数据集排序,再比较这几种排序方法用时。
使用randint随机生成整数
数据集生成的基本思路:先生成一个有序数列,然后将少量数据插入有序数列中,这里取 0.1*n 个乱序插入到 0.9*n 个有序数列中。
时间单位是秒,多次测试结果基本差不多,这里猪哥随机选取依次测试结果, 全场敷冰进行,请勿模仿 :
冒泡排序耗时:2.4080276489257812e-05
选择排序耗时:1.9311904907226562e-05
插入排序耗时:1.5020370483398438e-05
希尔排序耗时:1.5974044799804688e-05
归并排序耗时:2.8848648071289062e-05
快速排序耗时:1.9073486328125e-05
冒泡排序耗时:0.000782012939453125
选择排序耗时:0.0004570484161376953
插入排序耗时:0.00039076805114746094
希尔排序耗时:0.00018095970153808594
归并排序耗时:0.0003409385681152344
快速排序耗时:0.00017905235290527344
冒泡排序耗时:0.08327889442443848
选择排序耗时:0.03776884078979492
插入排序耗时:0.04986977577209473
希尔排序耗时:0.0034036636352539062
归并排序耗时:0.005920886993408203
快速排序耗时:0.0021750926971435547
冒泡排序耗时:8.781844854354858
选择排序耗时:3.438148021697998
插入排序耗时:4.186453819274902
希尔排序耗时:0.05663800239562988
归并排序耗时:0.06386470794677734
快速排序耗时:0.02335190773010254
冒泡排序耗时:900.5480690002441
选择排序耗时:879.1669909954071
插入排序耗时:428.66180515289307
希尔排序耗时:0.967015266418457
归并排序耗时:1.4872560501098633
快速排序耗时:0.3050980567932129
再经过几小时等待后,我仿佛闻到一股烧焦的味道,真香~
冒泡排序耗时:2.288818359375e-05
选择排序耗时:1.9788742065429688e-05
插入排序耗时:1.3113021850585938e-05
希尔排序耗时:1.5974044799804688e-05
归并排序耗时:2.9087066650390625e-05
快速排序耗时:1.811981201171875e-05
冒泡排序耗时:0.0004851818084716797
选择排序耗时:0.0004131793975830078
插入排序耗时:0.00013065338134765625
希尔排序耗时:0.00015997886657714844
归并排序耗时:0.00032019615173339844
快速排序耗时:0.00015974044799804688
冒泡排序耗时:0.05040717124938965
选择排序耗时:0.03394508361816406
插入排序耗时:0.009570121765136719
希尔排序耗时:0.0029370784759521484
归并排序耗时:0.005821943283081055
快速排序耗时:0.0022530555725097656
冒泡排序耗时:5.24026083946228
选择排序耗时:3.340329885482788
插入排序耗时:0.8101489543914795
希尔排序耗时:0.04622912406921387
归并排序耗时:0.05988883972167969
快速排序耗时:0.023930788040161133
无
我们从两种数据结果看,冒泡几乎都是最慢的
我们看到在随机数排序结果中,只有当 n=10 时,快排反而比较慢,而插入和希尔排序相对较快,这是因为插入排序和希尔排序都属于插入类型的排序,而快排和冒泡属于交换类排序,数据量少时交换所消耗的资源占比大。
在基本有序数据排序结果中,当n=10和n=100中都是插入排序消耗时间更短,因为数据基本有序,所以需要插入的次数比较少,尽管插入排序需要一个一个比较,但因为数据量不大,所以比较所消耗的资源占比不会太大。
快排果然还是名副其实的快,我们看到当数据集达到十万级别时,冒泡排序已经用时800多秒,而快排只用了0.3秒,相信随着数据量的增大,它们之间的差距也会越来越大。
之前我们讲过快排优化方案:对于大数据集排序先使用 快排 ,使数据集达到 基本有序 ,然后当分区达到一定小的时候使用 插入排序 ,因为插入排序对少量的基本有序数据集性能优于快排!
声音在物体中传播速度的排序由高到低分别是什么?
原理:声音是一种压力波:当演奏乐器、拍打一扇门或者敲击桌面时,他们的振动会引起介质——空气分子有节奏的振动,使周围的空气产生疏密变化,形成疏密相间的纵波,这就产生了声波,这种现象会一直延续到振动消失为止。声音作为波的一种,频率和振幅就成了描述波的重要属性,频率的大小与我们通常所说的音高...
猫狗人,按照反应速度怎么排序?
按照反应程度的排序是:猫的反应速度最快,狗次之,人的反应速度最慢。猫的反应速度大概是人的2-3倍,是狗的一倍多。猫的反应速度之所以这么快,是因为猫的视网膜上有两种主要的感光细胞:视锥细胞和视杆细胞。视锥细胞是颜色感受细胞,负责感知色彩,我们人类视网膜上大约有1.2亿视杆细胞,和6百万...
猫狗人,按照反应速度怎么排序?
1. 研究表明,在猫、狗、人三者中,狗的反应速度最快,其次是猫,人类的反应速度最慢。2. 狗的神经系统高效,能够迅速接收和处理信息,这使得它们在反应速度上表现出色。3. 狗天生的狩猎和牧羊本能,需要它们快速反应以追踪和捕捉猎物,因此它们的反应速度非常快。4. 猫的反应速度虽然略逊于狗,但...
猫狗人,按照反应速度怎么排序?
普通人的反应速度为0.2到0.3秒,而训练有素的专业人士的反应速度也只有0.1秒。人类的反应速度受到神经系统的限制,不能与狗和猫媲美。总的来说,狗和猫在反应速度上都比人类有优势。狗的速度最快,猫次之,而人类的反应速度最慢。这也是为什么狗和猫能够在很短的时间内做出反应和决策,而人类需要...
光的传播速度大小排序?急
光的传播速度大小排序如下 光在空气中传播最快。光的传播不需要介质,所以,它所要通过物质传播,密度越低,传播速度越快。光在固体,液体,空气中传播时,由快到慢依次是空气(真空、气体)、液体、固体。所受阻碍越小,传播越快。光的传播和声音的传播正好是反着的。因为光的传播不需要介质,所以,...
趋于无穷大的速度排序是什么?
以n为变量,下面按趋于无穷大时从快到慢排序:n的n次方,n的阶乘,a的n次方(指数函数)a>1,n的a次方(幂函数)a>0,对数函数ln(n)。常见的几个趋于无穷大的函数可按这个顺序,如果做题时遇上了,可直接比较大小得出结果。比如x趋于正无穷x\/e^x,可直接得结果为0,x趋于0+,xlnx可直接...
声音在物体中传播速度的排序由高到低分别是什么?
声音在物体中传播速度的排序由高到低固体、液体、气体。声音在不同介质中的传播速度不同,即在一般情况下,在固体中最快,在液体中其次,在气体中最慢;且即使在同一介质中,在温度不同的情况下其传播速度也是不同的。声音传播的三个条件:有声源、有声音的传播介质、有正常的人耳。声音是由物体振动...
数据结构概论 试题求解
48.排序的稳定性是指排序算法中的比较次数保持不变,且算法能够终止。B 49.快速排序的速度在所有排序方法中为最快,而且所需附加空间也最少。B 50.邻接多重表是无向图和有向图的链式存储结构。B 51.强连通图的各顶点间均可达。A 52.度为二的树就是二叉树。B 大概都对吧,个别没确定答案,...
在散列表和排序后的列表中找一个元素,哪个查找速度最快? 最简洁的答案...
由于快速排序不稳定,因此使用了随机数据。3.2 对试验结果的分析:注意到两个程序的用时并不像我们期望的那样,总是哈希表快。设哈希表的大小为 P .首先,当规模比较小的时候(大约为a< 10% * P,这个数据仅仅是通过若干数据估记出来的,没有严格证明,下同),第二种方法比哈希表快。这是由于,虽然每次计算哈希函数...
用正常的步伐走完5米的距离需要多长时间速度是多少运动速度从快到慢...
可能一秒钟走个半米左右,如果是你正常的步伐赶着上学的话,可能是一秒钟能走出来两米。如果不是人类走路的话,换其它的动物走路那就不见得了,如果是,小猫小狗的话,正常的一秒钟走的距离大概要比这来走的要快一些。所以小猫小狗走完五米的距离,估计也就是两秒钟左右。
羽凭舒配: 当然是递归,重复调用函数的开销并不会很大,待排序数组,元素为int型,元素大小为0-100k之间的随机数,初始状态无序1:系统排序函数 100k个数据 秒过,1000k个数据 0.125秒,10000k个数据1.25秒2:冒泡排序 100k个数据 21秒3:选择...
黄岛区13332735622: 快速排序算法是不是最快的算法,为什么,什么时候最快 - ?
羽凭舒配: 排序算法不稳定的含义是: 在排序之前,有两个数相等. 但是在排序结束之后,它们两个有可能改变顺序. 比如说: 在一个待排序队列中,A和B相等,且A排在B的前面,而排序之后,A排在了B的后面.这个时候,我们说这种算法是不稳定的. (...
黄岛区13332735622: 关于堆排序,归并排序,快速排序的比较,到底谁快 - ?
羽凭舒配: 种非平方级的排序: 希尔排序,堆排序,归并排序,快速排序 我测试的平均排序时间:数据是随机整数,时间单位是秒 数据规模 快速排序 归并排序 希尔排序 堆排序 1000万 0.75 1.22 1.77 3.57 5000万 3.78 6.29 9.48 26.54 1亿 7.65 13.06 18.79 61.31 堆排序是最差的. 这是算法硬伤,没办法的.因为每次取一个最大值和堆底部的数据(记为X)交换,重新筛选堆,把堆顶的X调整到位,有很大可能是依旧调整到堆的底部(堆的底部X显然是比较小的数,才会在底部),然后再次和堆顶最大值交换,再调整下来. 从上面看出,堆排序做了许多无用功.
黄岛区13332735622: 100万个随机数的数组,快速排序比插入排序快多少倍 - ?
羽凭舒配: 忽略常数、误差的平均情况中,快速排序执行约10^7次,插入排序执行约10^12次,大约十万倍吧
黄岛区13332735622: 归并排序与快速排序谁快谁慢 - ?
羽凭舒配: 用这两种不同的排序方法,分别对1000个无序的数进行排序,看谁更快.当然,也可以把1000替换成10000或者更多(前提是int没有暴掉). 网上流传着一种快速排序的写法,是用两个指针分别从左至破口大骂和从右至左扫描,那样的代码也太复杂了吧.像下面这段程序写的,要简单得多.
黄岛区13332735622: 数据结构中的快速排序? - ?
羽凭舒配: 快速排序是一种排序算法,由C. A. R. Hoare所发展的,以平均效能来说,排序 n 个项目要Θ(n log n)次比较.然而,在最坏的效能下,它需要Θ(n2)次比较.一般来说,快速排序实际上明显地比其他Θ(n log n) 演算法更快,因为它的内部回圈(inner loop)可以在大部分的架构上很有效率地被实作出来,且在大部分真实世界的资料,可以决定设计的选择,减少所需时间的二次方项之可能性.
黄岛区13332735622: 什么排序的速度(时间复杂度)最快? - ?
羽凭舒配: 从时间复杂度看,所有内部排序方法可以分为两类.1.插入排序 选择排序 起泡排序 其时间复杂度为O(n2);2.堆排序 快速排序 归并排序 其时间复杂度为O(nlog2n).这是就平均情况而言的,如果从最好的情况考虑, 则插入排序和起泡排序的时间复杂度最好,为O(n), 而其他算法的最好情况同平均情况大致相同.如果从最坏的情况考虑,快速排序的时间复杂度为O(n2),插入排序和起泡排序虽然同平均情况相同,但系数大约增加一倍,运行速度降低一半,而选择排序、堆排序和归并排序则影响不大.总之, 在平均情况下,快速排序最快; 在最好情况下,插入排序和起泡排序最快; 在最坏情况下,堆排序和归并排序最快.
黄岛区13332735622: 什么是冒泡排序和快速排序?两者之间的区别是什么?编程时哪一种排序方法比较好? - ?
羽凭舒配: 冒泡排序的基本思想是:通过无序区中相邻记录关键字间的比较和位置的交换,使关键字最小的记录如气泡一般逐渐往上“漂浮”直至“水面”.整个算法是从最下面的记录开始,对每两个相邻的关键字进行比较,且使关键字较小的记录换至...
黄岛区13332735622: 数据结构(c语言)中快速排序什么时候排序最慢,什么情况下使用快速排序? - ?
羽凭舒配: 当待排序的序列已经有序(不管是升序还是降序),此时快速排序最慢,一般当数据量很大的时候,用快速排序比较好,为了避免原来的序列有序,一般采用改进的快速排序算法,在排序之前随机交换两个元素的位置,就可以达到目的了,有一本书,叫《算法设计、分析与实现:C、C++和java》徐子珊著.可以看看,里面写了很多基本的算法
黄岛区13332735622: 快速排序为什么是效率最高的? - ?
羽凭舒配: 基数排序是属于稳定性的排序在某些时候是比其他的比较性排序要快 但是如果看一般情况,数据为随机的,快速排序是效率很高的.