zoukankan      html  css  js  c++  java
  • 基数排序

    核心代码 

      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+桶的个数

          稳定性:稳定

  • 相关阅读:
    怎样在ASP.NET中使用VB.NET上传大文件
    准备开始研读petShop
    Documentum常见问题9—导航树的一些常见设置
    [转]CMMI 入门 基本术语:约束、假设、依赖、风险、承诺
    MyEclipse 8.6反编译插件安装
    Documentum常见问题7—为客户化Type类型Import时添加自定义属性
    【自省篇】程序员的十大技术烦恼
    Documentum常见问题10修改特定Type的显示图标
    打发时间的题目,每天做一点
    Documentum常见问题8—限制导航树上的文件夹个数
  • 原文地址:https://www.cnblogs.com/chen-cai/p/7689791.html
Copyright © 2011-2022 走看看