排序里的基数排序,用起来还挺顺手的。它不比大小,而是按位来分桶。比如先看个位,再看十位、百位,一轮轮下来,数据就排好了。这招在大量整数时管用,尤其是数值不太大的时候,效率还挺高的。
基数排序靠的是分桶,每一位都设十个桶(0-9),把数字按当前位数扔进去,再按顺序拿出来。整个过程不比大小,所以不会出现“越比较越乱”的情况,也不会影响相等元素的顺序,稳定性不错。
方式也蛮直接的,通常用计数排序来配合分桶操作。因为它在小范围整数排序上快得飞起。排序的时候你只需要知道最大数有几位,从个位开始一轮轮地排,像流水线一样,有条理。
说点实在的,时间复杂度是 O(n * k)
,n 是元素数量,k 是最大数的位数,效率还蛮高的;不过空间占用是 O(n + k)
,要准备不少桶和中间数组,内存不太够的话就得留意了。
场景也蛮清晰的——数据量大、范围小、对顺序敏感的情况下,它是个挺不错的选项。比如排序手机号、学生学号这种场景就合适。但如果你是浮点数、字符串啥的,那就不太合适了,得换别的招。
实现上有两种思路:LSD和MSD,一个从低位开始,一个从高位。大多数时候用 LSD,实现简单还高效,尤其是像 [170, 45, 75, 90]
这种整数数组。
总的说来,基数排序是个挺实用的排序利器,适合做稳定性强、效率要求高的任务。如果你刚好在做这类需求,可以先试试它,再看要不要搭配 桶排序 或 插入排序 做组合拳。