1 #include<iostream>
2 #include<string>
3 using namespace std;
4 //数值型基数排序
5 int getDigit(int num, int index)
6 {
7 int mod = 1;
8 while (index)
9 {
10 mod *= 10;
11 index--;
12 }
13 int div = mod / 10;
14 return num%mod / div;
15
16 }
17
18 void Count_Sort(int *A, int *B, int len, int k,int d)
19 {
20 int count = k + 1;
21 int *C = new int[count];
22 for (int i = 0; i < count; i++)
23 {
24 C[i] = 0;
25 }
26 for (int i = 0; i < len; i++)
27 {
28 C[getDigit(A[i], d)] = C[getDigit(A[i], d)] + 1;
29 }
30 for (int i = 1; i < count; i++)
31 C[i] = C[i] + C[i - 1];
32 for (int i = len-1; i >=0; i--)
33 {
34 B[C[getDigit(A[i], d)] - 1] = A[i];
35 C[getDigit(A[i], d)] = C[getDigit(A[i], d)] - 1;
36 }
37 }
38 void RADIX_SORT(int *A, int d,int len)
39 {
40 for (int i = 1; i <=d; i++)
41 {
42 int *B = new int[len];
43 Count_Sort(A, B, len, 10,i);
44 for (int i = 0; i < len; i++)
45 {
46 A[i] = B[i];
47 }
48 }
49 }
50 //字符型基数排序
51 int getAlpha(string A, int index)
52 {
53 return (A[A.length()-index]-'a');
54 }
55 void Count_SortAlpha(string*A, string*B, int len, char k, int d)
56 {
57 int count = (k-'a' + 1);
58 int *C = new int[count];
59 for (int i = 0; i < count; i++)
60 {
61 C[i] = 0;
62 }
63 for (int i = 0; i < len; i++)
64 {
65 C[getAlpha(A[i], d)] = C[getAlpha(A[i], d)] + 1;
66 }
67 for (int i = 1; i < count; i++)
68 C[i] = C[i] + C[i - 1];
69 for (int i = len - 1; i >= 0; i--)
70 {
71 B[C[getAlpha(A[i], d)]-1 ] = A[i];
72 C[getAlpha(A[i], d)] = C[getAlpha(A[i], d)] - 1;
73 }
74 }
75 void RADIX_SORTAlpha(string A[], const int d, const int len)
76 {
77 for (int i = 1; i <= d; i++)
78 {
79 string *B=new string[len];
80 Count_SortAlpha(A, B, len, 'z', i);
81 for (int i = 0; i < len; i++)
82 {
83 A[i] = B[i];
84 }
85 delete[] B;
86 }
87 }
88
89 int main()
90 {
91
92
93 int A[] = { 329,457,657,839,436,720,355,0,12,15,105 };
94 int N = sizeof A / sizeof A[0];
95 RADIX_SORT(A, 3, N);
96 for (int i = 0; i<N; i++)
97 {
98 cout << A[i] << " ";
99 }
100 cout << "\n";
101
102 string Alpha[] = { "cow", "sea", "rug", "row","mob","box","tab","bar","tar","dig","big","tea","now","fox" };
103
104 N = sizeof Alpha / sizeof Alpha[0];
105 RADIX_SORTAlpha(Alpha, 3, N);
106 for (int i = 0; i < N; i++)
107 {
108 cout << Alpha[i] << " ";
109 }
110 cout << "\n";
111
112 return 0;
113
114
115
116 }