冒泡排序和快速排序的比较
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 |
所以说,不要用快排排逆序。
以上是关于冒泡排序和快速排序的比较的主要内容,如果未能解决你的问题,请参考以下文章