(单位纳秒us)
数据量 | 10 | 100 | 1000 | 1万 | 10万 | 100万 | 1千万 | 1亿 |
内存占用 | 40B | 400B | 3.9K | 39.0K | 390K | 3.81M | 38.1M | 381M |
冒泡排序 | 20 | 40 | 820 | 79,600 | 7,676,124 | |||
插入排序 | 10 | 10 | 180 | 17,842 | 1,794,997 | |||
选择排序 | 10 | 10 | 300 | 28,283 | 2,833,339 | |||
快速排序 | 10 | 20 | 90 | 810 | 8,501 | 95,502 | 964,722 | 10,148,458 |
希尔排序 | 10 | 10 | 30 | 340 | 4,950 | 76,449 | 1,282,982 | 21,124,892 |
堆排序 | 40 | 40 | 70 | 510 | 6,190 | 82,750 | 1,187,910 | 16,861,891 |
归并排序 | 20 | 20 | 40 | 340 | 3,930 | 46,845 | 538,978 | 6,117,406 |
计数排序 | 10 | 10 | 20 | 40 | 390 | 7,800 | 173,752 | 2,232,933 |
基数排序 | 20 | 20 | 30 | 200 | 2,270 | 25,763 | 304,298 | 3,424,614 |
桶排序 | 40 | 40 | 60 | 160 | 2,050 | 45,785 | 653,693 | 10,866,139 |
(基数排序是10进制,9位数排序。数据为1-N的随机数,N就是数据量大小)
冒泡排序比选择排序要慢狠多狠多,虽然比较的次数几乎一样。这主要是因为冒泡排序几乎没有缓存命中。
快速排序所有数量下都有稳定的发挥。尤其是数据规模超过内存上限时,实行分块比较很适合,而且没有辅助内存的需求。
希尔排序在数据量规模不大的时候比快速排序要好。这主要也是缓存命中率的影响。
基数排序已经非常接近计数排序了,当将基数增加到20,位数降到7时,1亿的排序时间是3,432,145,并没有太大区别。当将基数增加到100,位数降到4时,1亿的排序时间是1,979,761。比计数排序更快一点,位数减少循环次数就变少了。但是居然比计数排序还快,难道有bug?
桶排序数据规模较大时,速度变得慢了。应该是因为桶的利用率不高。测试数据的最大值就是数据的数量,因此平均1个桶里只有一个数据。分桶后又进行了插入排序,cpu执行不利索。当数据范围是[1,N/4)时,1亿个排序时间是7,191,853,更快了一点。