冒泡排序和快速排序的比较

Posted 幽流书堂

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了冒泡排序和快速排序的比较相关的知识,希望对你有一定的参考价值。

冒泡排序和快速排序都属于交换排序,但快速排序不是冒泡排序的改进算法。

对于冒泡排序的改进算法,比较常用的是鸡尾酒排序,原理是从数组两端进行冒泡排序,先从左往右排出最大的,再从倒数第二项开始从右往左排出最小的,以此类推。

冒泡排序是一种基本排序算法,时间复杂度为 O(n2),空间复杂度为 O(1),即只占用一个额外的变量的内存空间,是稳定的排序算法。

快速排序是一种高级的排序算法,平均时间复杂度为 O(nlog2n),由于快速排序是递归算法,所以会占用较多的内存空间,最优情况为每次递归都平分当前数组,空间复杂度为 O(log2n),最差情况为每次递归选取的节点均为最值,这样就类似于转换成了插入排序,比如对逆序数组排序,此时空间复杂度为 O(n)。快速排序是不稳定的排序算法。

随着元素个数的增多,耗时的情况如下图所示,红色为 n2,蓝色为 nlog2n。




以 40 个数据的小数组为例,横向比较两种排序算法对四类数组排序的效率。


random
nearly sorted
bubble
quick bubble quick
8388 4325 2019 4077
8757 4206 1865 4102
6514 2448 1087 2446
6855 3399 1387 3181
4693 2461 1107 2332
6586 3403 1641 3204
6815 3446 1507 3303
6379 3321 2046 3250
6573 4337 2145 3995
7114 3650 2171 3454
—— —— —— ——
6867 3500 1698 3334


reversed
few unique
bubble
quick bubble quick
6695 5191 6586

3669

6811 5284 6688 3640
3964 3077 3844

2084

5422 4169 5344

2892

3907 3168 4317

2110

5306 4155 5394

2802

5297 4265 5388

2925

5410 4209 6351 3422
7716 5060 6842 3585
5648 4258 5536 3747
—— —— —— ——
5618 4284 5629

3088

对接近完成排序的数组,冒泡的效率高,对逆序数组,二者效率接近。


接下来比较大数组,内容为随机数据。

200个
500个
bubble
quick bubble quick
108381 19425 728997 63299
122025 19636 656694 47346
132681 21537 722153 43580
122098 19971 614422 50899
101384 16316 567838 63225
120506 20276 712657 52292
112554 18220 652949 50993
120900 19653 808855 53712
122440 20015 692432 67212
108242 17451 684684 69810
—— —— —— ——
117121 19250 684168 56237


1,000个
5,000个
bubble
quick bubble quick
2005644 109428 67694909

925058

1957682 132079 61479820

809414

3162437 143610 60544743

815997

2194911 100285 57457872

815141

5496963 375760 68074947

928075

2135678 109748 54994327

814701

2175260 110074 52622903 833365
2134268 109662 77717608 928239
2529290 135680 62881465 845930
4319841 205658 51514808 812377
—— —— —— ——
2311197 153198 61498340

852830

随着数据量的增加,二者差别越来越明显。


由于在冒泡排序当中一旦有一轮循环没有发生逆序便结束排序,所以在对接近完成排序的大数组进行排序时,冒泡排序会远快于快速排序,此处不再验证。


接下来测试逆序大数组。

200个
500个
bubble
quick bubble quick
120213 88369 730706 395808
140136 88506 610313 346285
120264 79942 734405 356658
120123 80032 518200 367240
120151 79095 675031 397670
120232 79676 723572 367937
120156 79003 696101 396603
127496 75258 715150 368413
119949 80145 652953 366175
115204 78072 629748 368018
—— —— —— ——
122392 80810 668618 373081


1,000个
5,000个
bubble
quick bubble quick
2474518 1503057 58726915 32485946
2347231 1299435 53402388 32179520
2187403 1319411 56655238 32048779
2949185 1808201 65687411 32890689
2316635 1364235 53156360 31875645
2257133 1346301 53681515 31922142
2185842 1320939 55453267 32563823
2125418 1337435 59009721 32681819
2239289 1297321 53874026 31931161
2311290 1320219 53003089 32027857
—— —— —— ——
2339394 1391655 56264993 32260738

所以说,不要用快排排逆序。

以上是关于冒泡排序和快速排序的比较的主要内容,如果未能解决你的问题,请参考以下文章

快速排序和冒泡排序

经典排序之冒泡排序和快速排序

交换排序之冒泡排序和快速排序

有关快速排序和冒泡排序的理解

图形化排序算法比较:快速排序插入排序选择排序冒泡排序

快速排序算法回顾 --冒泡排序Bubble Sort和快速排序Quick Sort(Python实现)