快速排序、归并排序、堆排序的对比
即使是同样的算法,不同的人写的代码,不同的应用场景下执行时间也可能差别很大。下面是一个测试数据:
测试的平均排序时间:数据是随机整数,时间单位是s 数据规模 快速排序 归并排序 希尔排序 堆排序 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
大数据量下,快速排序优于归并排序优于堆排序。
原因如下:
快速排序 vs 归并排序
当数据量越来越大时,
归并排序:比较次数少,速度慢。
快速排序:比较次数多,速度快。
快速排序的优势越来越明显。
原因分析:个人认为是当数据量越来越大时,尽管归并排序的比较次数较少,但是归并排序后期的合并操作所花费的时间便越来越大,合并操作对整体的效率影响越来越明显,包括后面大量数据的赋值操作等。所以当数据量变大时,不需要专门合并的快速排序的优势就变得越发明显。
快速排序 vs 堆排序
堆排序每次取一个最大值和堆底部的数据交换,重新筛选堆,把堆顶的X调整到位,有很大可能是依旧调整到堆的底部(堆的底部X显然是比较小的数,才会在底部),然后再次和堆顶最大值交换,再调整下来,可以说堆排序做了许多无用功。
总结起来就是,快排的最坏时间虽然复杂度高,但是在统计意义上,这种数据出现的概率极小,而堆排序过程里的交换跟快排过程里的交换虽然都是常量时间,但是常量时间差很多。