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