基数排序
核心代码
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+桶的个数
稳定性:稳定