notes/13_sorts/readme.md
如何按年龄给 100 万用户排序?
算法思想:
计数排序可以视作是桶排序的一个特殊情况:
此时,由于分桶内的元素 key 值都一样,所以桶内的排序操作可以省略,以及桶的编号本身就能记录桶内元素的值。因此,算法只需遍历一遍所有的数据,统计每个取值上有多少元素即可。这个过程时间复杂度是 $O(n)$。
A = {2, 5, 3, 0, 2, 3, 0, 3},我们有计数数组 C = {2, 0, 2, 3, 0, 1}接下来,我们要对 C 进行计数操作,具体来说,对从下标为 1 的元素开始累加 C[i] += C[i - 1]。
C = {2, 2, 4, 7, 7, 8}此时,C 中的元素表示「小于等于下标的元素的个数」。接下来,我们从尾至头扫描待排序数组 A,将其中元素依次拷贝到输出数组 R 的相应位置。我们注意到,A[7] = 3 而 C[3] == 4 。这意味着,待排序的数组中,包括 3 本身在内,不超过 3 的元素共有 4 个。因此,我们可以将这个 3 放置在 R[C[3] - 1] 的位置,而后将 C[3] 的计数减一——这是由于待排序数组中未处理的部分,不超过 3 的元素现在只剩下 3 个了。如此遍历整个待排序数组 A,即可得到排序后的结果 R。
基数排序适用于等长数据的排序。对于不等长数据,可以在较短的数据后面做 padding,使得数据等长。
桶排序。