排序——基数排序 收藏


以前只是理解基数排序的理论,感觉很简单,从来没有实现过,今天实现时遇到了一些细节问题:

(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 } 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值