RadixSort(基数排序)原理及C++代码实现

基数排序是一种思想很值得学习的排序方法。

它突破了正常的排序思维:先排高位,如果高位相同再排次高位,直至最低。它的思想是利用稳定排序从低位开始排,最后再排最高位。

另外它用来划分的位不一定是一位一位的划分,还可以是每几位一组,然后按组从低到高来排序。

事实上,当总位数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 }
posted @ 2020-01-14 19:35  简讯  阅读(559)  评论(0编辑  收藏  举报