在路上

不是专业,只会通俗

导航

排序算法_基数排序

一、算法描述  

将所有待比较数值(正整数)统一为同样的数位长度,数位较短的数前面补零。
然后,从最低位开始,依次进行一次排序。
这样从最低位排序一直到最高位排序完成以后, 数列就变成一个有序序列。 

二、示例

  假设原来有一串数值如下所示:

  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++实现代码  

View Code
 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/基数排序

 

posted on 2013-01-18 18:40  OnRoad_  阅读(299)  评论(0编辑  收藏  举报