基数排序是一种思想很值得学习的排序方法。
它突破了正常的排序思维:先排高位,如果高位相同再排次高位,直至最低。它的思想是利用稳定排序从低位开始排,最后再排最高位。
另外它用来划分的位不一定是一位一位的划分,还可以是每几位一组,然后按组从低到高来排序。
事实上,当总位数b等于O(lgn),并且每一组的位数r等于lgn时,基数排序的时间复杂度为θ(n)。
基数排序当然也是稳定排序。
代码如下:(仅供参考)
1 int PickDigitOn_i(int n, const int i) { 2 for (int k = 1; k <= i; ++k) 3 n /= 10; 4 return n % 10; 5 } 6 7 void stablesort_onDigit_i(int * const begin, int * const end, int d) { //使用计数排序作为稳定排序 8 int temp[10] = {0}; //十进制数 9 vector<int> out(end - begin); 10 11 for (int i = 0; i < end - begin; ++i) 12 ++temp[PickDigitOn_i(*(begin + i), d)]; 13 for (int i = 1; i < 10; ++i) 14 temp[i] += temp[i-1]; 15 for (int i = end - begin - 1; i >= 0; --i) { 16 out[temp[PickDigitOn_i(*(begin + i), d)] - 1] = *(begin + i); 17 --temp[PickDigitOn_i(*(begin + i), d)]; 18 } 19 for (int i = 0; i < end - begin; ++i) 20 *(begin + i) = out[i]; 21 } 22 23 void RadixSort(int * const begin, int * const end) { //假设三位数的排序 24 for (int i = 0; i < 3; ++i) { 25 stablesort_onDigit_i(begin, end, i); 26 } 27 }