基数排序

核心代码 

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

      稳定性:稳定

posted @ 2017-10-18 23:18  c&z  阅读(234)  评论(0编辑  收藏  举报