【Sort】RadixSort基数排序

太晚了,明天有时间在写算法思路,先贴代码

————————————————————————————————————————————————

刚答辩完,毕业好难,感觉自己好水

————————————————————————————————————————————————

 

解题思路:

  由低位到高位进行排序,比如数组33,22,11,44,67,76,95,98,89,107,最大的数107,也就是需要

三趟排序:

1.相同位置上的数字按照大小排序

2.相同位置上,相同大小的数字按照发现的先后排序。

 

第一趟,按照个位进行排序,排序后的结果为:11,22,33,44,95,76,67,107,98,89

第二趟,按照十位进行排序,排序后的结果为:107,11,22,33,44,67,76,89,95,98

第三趟,按照百位进行排序,排序后的结果为,11,22,33,44,67,76,89,95,98,107

时间复杂度为O(M*5N),需要线性的外部空间,实际使用中应该较少,不过这种方法的

变种应该挺有用,比如位排序(http://www.cnblogs.com/fcyworld/p/6147042.html)

 1 #include <iostream>
 2 
 3 using std::cout;
 4 
 5 void radixsort(int *a,int num);
 6 int loop(int *a,int num);
 7 int main()
 8 {
 9     int a[10]={33,22,11,4,7,6,5,98,89,107};
10     radixsort(a,10);
11     for(int i=0;i<10;i++)
12         cout<<a[i]<<" ";
13     return 0;
14 }
15 int loop(int *a,int num)
16 {
17   int maxnum=0,i;
18   for(i=0;i<num;i++)
19     if(a[i]>maxnum)
20         maxnum=a[i];
21     i=1;
22     maxnum/=10;
23     while(maxnum>10)
24         {
25             i++;
26             maxnum/=10;
27         }
28     return i;
29 }
30 void radixsort(int *a,int num)
31 {
32     int looptime=loop(a,num);
33     int *counts=new int[10];
34     int *tmp=new int[num];
35     int i,j,k,rs=1;
36     for(j=0;j<looptime;j++)
37     {
38         for(i=0;i<10;i++)
39             counts[i]=0;
40         for(i=0;i<num;i++)
41         {
42             k=(a[i]/rs)%10;
43             counts[k]++;
44         }
45         for(i=1;i<10;i++)
46             counts[i]+=counts[i-1];    //确定每个数字出现的次数以及范围,
                          //比如counts[0]=3,counts[1]=5,
                          //那么数字1应该保存的位置就应该在索引8以下,
                          //而数字1出现的次数由原数组中计算,感觉这个方法很巧妙
47 for(i=0;i<num;i++) 48 { 49 k=(a[i]/rs)%10;        //计算每个数字应该保存的位置 50 tmp[counts[k]-1]=a[i];    // 51 counts[k]--; 52 } 53 for(i=0;i<num;i++) 54 a[i]=tmp[i]; 55 rs*=10; 56 } 57 delete[]tmp; 58 delete[]counts; 59 }

 

posted @ 2016-12-14 00:04  wilderness  阅读(210)  评论(0编辑  收藏  举报