序言
非比较排序,不需要比较,交换,在线性时间内完成排序。缺点:空间要求较多,不是原地排序,典型的空间换取时间。
计数排序
计数排序利用一个特点:已经排好序(例如从小到大)的数组中,第i个元素为x,则数组中一定有:小于等于x的元素有i个。计数排序需要一个空间代价:n + max_num.
桶排序
桶排序包含两个步骤:分发元素到每个桶内;顺序回收桶内元素。伪代码如下:
BUCKET_SORT (A)
- n ← length [A]
- For i = 1 to n do
- Insert A[i] into list B[nA[i]]
- For i = 0 to n-1 do
- Sort list B with Insertion sort
- Concatenate the lists B[0], B[1], . . B[n-1] together in order.
代码实现
bucket_sort是直接遍历count 判断是否大于1,回收元素,counting_sort是把count的内容转化为
原数组排序后该元素前面元素的个数,同样需要遍历一次。
测试结果:
计数和桶排序时间上的优势不用说了,但是这些非比较排序算法对空间要求比较高,而且跟排序数据的分布也有关。上面的测试结果是基于所有随机数据都在[0-255]之间的假设前提。数据分布越散乱,空间复杂度越高。
后记
桶排序的思路尤其适合字符串数组的排序,因为acsii字符都位于0,255之间。更加一般的桶排序可以使用链表,有时间再续吧~