基数排序
基数排序是一种有趣的算法,有一点逆向思维的冲突在里面。下面举一个例子:
如果要对5个3位整数进行排序,你会怎么做?我猜想大多数人会这样做(根据我们学习过的的数学中的一些概念惯性):
123 123 123
343 135 135
362 241 241
241 343 343
135 362 362
先对高位进行排序,然后对高位相同的,次高位进行排序,一直进行到低位。
基数排序进行排序的方向和我们通常思考的方向相反,也就是说从低位开始往高位排序,为什么也能得到正确的结果呢?
这里用到了数学里的归纳法,或者说是计算机科学里的递推法,由于这是一个递归的过程,试想对低1位排好序之后,低1位是有序的,
接着对第2位进行排序,排好了之后分成两种情况来考虑,那些严格递增的低2位数的排序是正确的,原因理所当然,那么那些非严格递增,在这里也就是相等的第2位的低2位数的大小是由低1位决定的,如果不改变相等元素的相对的位置的话,实际情况也是的,那么相等的第2位的低2位数值也是有序,这样整个都是有序的,这种思考可以递推到多位数的情况,所以从低位到高位的排序算法是正确的。
从以上的论述中可以看出,对每一位进行排序,需要选择一个稳定的排序算法,这里的稳定是指,排序key相等的时候,保持其原先的前后关系。
基数排序可以应用到其他的多字段排序的问题当中,为什么呢?很容易想这里的字段相当于一个数字位,可以很容易的映射到一个字段,任何可以用来排序的对象。