一、10算法分类
本文一共总结了10种排序算法,其中
基于比较的排序算法有
冒泡排序,插入排序,希尔排序,选择排序,归并排序,堆排序,快速排序;
线性时间排序算法包括
计数排序,基数排序,桶排序;
前边有提到过,基于比较的排序算法,时间复杂度最差达到O(nlogn)O(nlogn),无法突破这个界限,只有线性时间排序能够突破,达到O(n)O(n),所以说,如果满足了线性时间排序算法的限制条件,使用线性时间排序将会使排序性能得到极大提升。
二、实际测试数据
下面对以上涉及到的每种算法做一个简单的实际测试对比:利用随机数,随机生成区间0 ~ K之间的序列,共计N个数字,利用各种算法进行排序,记录排序所需时间,测试环境为i7+vs2015+Debug版本。
算法输入数据 | N=50 K=50 | N=200 K=100 | N=500 K=500 | N=2000 K=2000 | N=5000 K=8000 | N=10000 K=20000 | N=20000 K=20000 | N=20000 K=200000 |
---|---|---|---|---|---|---|---|---|
冒泡排序 | 0ms | 15ms | 89ms | 1493ms | 9363ms | 36951ms | 147817ms | 143457ms |
插入排序 | 1ms | 13ms | 82ms | 1402ms | 8698ms | 34731ms | 134817ms | 134836ms |
希尔排序 | 0ms | 1ms | 6ms | 30ms | 110ms | 257ms | 599ms | 606ms |
选择排序 | 0ms | 5ms | 31ms | 461ms | 2888ms | 11736ms | 45308ms | 44838ms |
堆排序 | 0ms | 3ms | 9ms | 40ms | 124ms | 247ms | 525ms | 527ms |
归并排序 | 2ms | 6ms | 18ms | 75ms | 199ms | 392ms | 778ms | 793ms |
快速排序 | 0ms | 1ms | 2ms | 14ms | 36ms | 84ms | 196ms | 163ms |
计数排序 | 0ms | 1ms | 1ms | 5ms | 15ms | 32ms | 51ms | 62ms |
基数排序 | 0ms | 1ms | 4ms | 19ms | 47ms | 114ms | 237ms | 226ms |
桶排序 | 0ms | 2ms | 6ms | 25ms | 68ms | 126ms | 254ms | 251ms |
三、性能对比小结
1. 传统简单排序确实当数据量很小的时候也表现不错,但当数据量增大,其耗时也增大十分明显;
2. 冒泡,插入,选择三种排序中,当数据量很大时,选择排序性能会更好;
3. 堆排,希尔,归并,快排几种排序算法也表现不错,源于其时间复杂度达到了O(nlogn)O(nlogn);
4. 随机快速排序性能确实表现十分亮眼,甚至有时比基数排序和桶排序还好,这可能也是快排如此流行的原因;
5. 线性排序中计数排序表现最好,但他们的限制也比较明显,只能处理范围内的正整数。