以前只是理解基数排序的理论,感觉很简单,从来没有实现过,今天实现时遇到了一些细节问题:
(1)保证排序子程序的稳定性,可以使用前面介绍过的计数排序。
(2)对于排序的整数,如果有d位,需要调用d次计数排序子程序,时间复杂度位O(d*n)。
(3)在是现实,由于需要d此调用计数排序,因此需要许多“根据第i位分配”——“重新组装”——“根据第i+1位分配”——“重新组装”,这就需要许多保存这些中间结果的数组,程序中使用两个数组a和b进行动态的分配和释放,时空间复杂度是O(n)。
view plaincopy to clipboardprint?
1 #include <iostream>
2 #include <cmath>
3 using namespace std;
4 const int K = 10;
5
6 void count_sort(int *a,int *b,int n,int d)
7 {
8 int c[K]={0};
9 int i =0;
10 int tmp = 0;
11 for(i=0;i<n;i++)
12 {
13 tmp = (a[i]%(int)pow(10,d))/pow(10,d-1);
14 c[tmp]++;//c[i]包含等于i的元素个数
15 }
16
17 for(i=1;i<K;i++)
18 c[i]+=c[i-1];//此时,c[i]包含小于等于i的元素个数
19 int j = 0;
20 if(d == 2)
21 {
22 /*
23 for(int k =0;k<K;k++)
24 {
25 cout << c[k];
26 }
27 cout << endl;
28 */
29 }
30 for(j = n-1;j>=0;j--)
31 {
32 tmp =(a[j]%(int)pow(10,d))/pow(10,d-1);
33 b[c[tmp]-1] = a[j];
34 c[tmp]--;//为了相同的元素
35 }
36 }
37 void base_sort(int *a,int *b,int n)
38 {
39 int i = 0;
40 for( i =1;i<4;i++)
41 {
42 if(i>1)
43 {
44 if(i>3)
45 {
46 delete []a;
47 a = NULL;
48 }
49 a=b;
50 b= new int[n];
51 }
52 count_sort(a,b,n,i);
53 for(int j =0;j<n;j++)
54 cout<<b[j] << " ";
55 cout << endl;
56 }
57 for(i=0;i<10;i++)
58 cout<<b[i] << " ";
59 delete[] a;
60 cout << endl;
61
62 }
63 int main()
64 {
65 int a[10] ={123,232,45,353,982,12,6,785,911,10};
66 int b[10];
67 base_sort(a,b,10);
68 }