• 基数排序


    核心代码 

      1 typedef struct node
      2 {
      3     int nValue;
      4     struct node *pNext;
      5 }Radix;
      6 
      7 void LSD(int arr[],int nLength,int nBegin,Radix **pRadix)
      8 {
      9     int nBase = 1;
     10     int nIndex;
     11     int i;
     12     Radix *pTemp = NULL;
     13     Radix *pMark = NULL;
     14     Radix *pDel = NULL;
     15     //求被除基数
     16     while(nBegin > 1)
     17     {
     18         nBase *= 10;
     19         --nBegin;
     20     }
     21     
     22     //根据被除基数将各元素入桶
     23     for(i=0; i<nLength; ++i)
     24     {
     25         nIndex = arr[i]/nBase%10;
     26 
     27         pTemp = (Radix*)malloc(sizeof(Radix));
     28         pTemp->nValue = arr[i];
     29         pTemp->pNext = NULL;
     30 
     31         //尾添加
     32         pMark = pRadix[nIndex];
     33 
     34         //头空
     35         if(NULL == pRadix[nIndex])
     36         {
     37             pRadix[nIndex] = pTemp;
     38         }
     39         else
     40         {
     41             while(pMark->pNext)
     42             {
     43                 pMark = pMark->pNext;
     44             }
     45 
     46             pMark->pNext = pTemp;
     47         }
     48     }
     49 
     50     //元素放回原数组
     51     nBase = 0;
     52     for(i=0; i<10; ++i)
     53     {
     54         pTemp = pRadix[i];
     55         while(pTemp)
     56         {
     57             arr[nBase] = pTemp->nValue;
     58             ++nBase;
     59             pTemp = pTemp->pNext;
     60         }
     61     }
     62 
     63     //释放小链表
     64     for(i=0; i<10; ++i)
     65     {
     66         pTemp = pRadix[i];
     67         while(pTemp)
     68         {
     69             pDel = pTemp;
     70             pTemp = pTemp->pNext;
     71             free(pDel);
     72             pDel = NULL;
     73         }
     74     }
     75 
     76     //哈希表清空
     77     memset(pRadix,0,sizeof(Radix*)*10);
     78 }
     79 
     80 void RadixSort(int arr[],int nLength)
     81 {
     82     int i;
     83     int nMax;
     84     int nBase;
     85     int nLoopTimes;
     86     Radix **pRadix = NULL;
     87     
     88     //检测参数
     89     assert(arr!=NULL && nLength>0);
     90 
     91     //找到最大值
     92     nMax = arr[0];
     93     for(i=1; i<nLength; ++i)
     94     {
     95         if(arr[i] > nMax)
     96         {
     97             nMax = arr[i];
     98         }
     99     }
    100 
    101     //分析最大值位数
    102     nLoopTimes= 0;
    103     while(nMax)
    104     {
    105         nMax /= 10;
    106         ++nLoopTimes;
    107     }
    108 
    109     pRadix = (Radix**)malloc(sizeof(Radix*)*10);
    110 
    111     //初始化哈希表
    112     memset(pRadix,0,sizeof(Radix*)*10);
    113 
    114     //各个位处理
    115     for(i=1; i<=nLoopTimes; ++i)
    116     {
    117         LSD(arr,nLength,i,pRadix);
    118     }
    119 }

    算法分析:

      最好时间复杂度:位数*(n+桶的个数)

      平均时间复杂度:位数*(n+桶的个数)

      最坏时间复杂度:位数*(n+桶的个数)

        空间复杂度:n+桶的个数

          稳定性:稳定

  • 相关阅读:
    int、bigint、smallint 和 tinyint
    我的fedora9安装后配置
    系统引导设置与管理EasyBCD与VistaBootPRO
    从Xml文档内部引用Xml Schema验证
    linux开机顺序
    OS引导-笔记
    Logic Volume笔记
    Service笔记
    python中若类属性与实例属性同名
    解析JavaScript中的null与undefined
  • 原文地址:https://www.cnblogs.com/chen-cai/p/7689791.html
Copyright © 2020-2023  润新知