排序算法_基数排序
一、算法描述
将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
然后,从最低位开始,依次进行一次排序。
这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。
二、示例
假设原来有一串数值如下所示:
73, 22, 93, 43, 55, 14, 28, 65, 39, 81
首先根据个位数的数值,在走访数值时将它们分配至编号0到9的桶子中:
0
1 81
2 22
3 73 93 43
4 14
5 55 65
6
7
8 28
9 39
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
81, 22, 73, 93, 43, 14, 55, 65, 28, 39
接着再进行一次分配,这次是根据十位数来分配:
0
1 14
2 22 28
3 39
4 43
5 55
6 65
7 73
8 81
9 93
接下来将这些桶子中的数值重新串接起来,成为以下的数列:
14, 22, 28, 39, 43, 55, 65, 73, 81, 93
这时候整个数列已经排序完毕;如果排序的对象有三位数以上,则持续进行以上的动作直至最高位数为止。
三、性能描述
数据结构 :数组
最差时间复杂度 :O(Kn)
最差空间复杂度 :O(Kn)
四、总结
基数排序(Radix sort)是一种非比较型整数排序算法,其原理是将整数按位数切割成不同的数字,然后按每个位数分别比较。
由于整数也可以表达字符串(比如名字或日期)和特定格式的浮点数,所以基数排序也不是只能使用于整数。
五、C++实现代码
1 #include <iostream> 2 3 using namespace std; 4 5 const int base=10; 6 7 struct wx 8 { 9 int num; 10 wx *next; 11 wx() 12 { 13 next=NULL; 14 } 15 }; 16 17 wx *headn,*curn,*box[base],*curbox[base]; 18 19 void basesort(int t) 20 { 21 int i,k=1,r,bn; 22 for(i=1;i<=t;i++) 23 { 24 k*=base; 25 } 26 r=k*base; 27 for(i=0;i<base;i++) 28 { 29 curbox[i]=box[i]; 30 } 31 for(curn=headn->next;curn!=NULL;curn=curn->next) 32 { 33 bn=(curn->num%r)/k; 34 curbox[bn]->next=curn; 35 curbox[bn]=curbox[bn]->next; 36 } 37 curn=headn; 38 for(i=0;i<base;i++) 39 { 40 if(curbox[i]!=box[i]) 41 { 42 curn->next=box[i]->next; 43 curn=curbox[i]; 44 } 45 } 46 curn->next=NULL; 47 } 48 49 void printwx() 50 { 51 for(curn=headn->next;curn!=NULL;curn=curn->next) 52 { 53 cout<<curn->num<<' '; 54 } 55 cout<<endl; 56 } 57 58 int main() 59 { 60 int i,n,z=0,maxn=0; 61 curn=headn=new wx; 62 cin>>n; 63 for(i=0;i<base;i++) 64 { 65 curbox[i]=box[i]=new wx; 66 } 67 for(i=1;i<=n;i++) 68 { 69 curn=curn->next=new wx; 70 cin>>curn->num; 71 maxn=max(maxn,curn->num); 72 } 73 while(maxn/base>0) 74 { 75 maxn/=base; 76 z++; 77 } 78 for(i=0;i<=z;i++) 79 { 80 basesort(i); 81 } 82 printwx(); 83 return 0; 84 }
参考文档:http://zh.wikipedia.org/wiki/基数排序