zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Domino
    tomcat 部署 外网访问
    市场4
    android 源码下载编译
    SSIS
    代码审查工具
    mfc 常用控件
    屏蔽home
    MFC BEGIN_MESSAGE_MAP()
    社交产品
  • 原文地址:https://www.cnblogs.com/yxsrt/p/12193720.html
Copyright © 2011-2022 走看看