@skyword
2017-06-03T06:11:37.000000Z
字数 2040
阅读 1211
基数排序算法设计,并测试
基数排序主要用于对整数排序
对于k进制m位整数序列,可以用基数排序的方式来排序,其中不足m位的整数补足前导0
定义k个顺序队列,例如对于十进制整数排序,定义十个队列
对于m位序列,执行m次排序,对于第i次排序
按照序列中从左到右的次序取数,若该数的第i位为t,则将该数入队列q[t],将所有数按此方法入队。
然后再按照q[0]到q[k]的次序将整数逐步出队,存储回到原数组中,完成一次排序
重复k次即可
实际上是将全部整数从低位到高位逐步排序,最终完成整体排序。
深入一步说,对于要排序的元素定义了一个有限维线性空间,维度为整数的最大位数,所谓定义k个队列就是选取了线性空间的一组基。基内元素是线性无关的,这是k次排序互不相关的原因。
从这个角度上讲,基数排序可以扩展到有限位小数排序,位数增多而已。
对于抽象数据类型的排序,若是能定义对应的有限维空间,并选择对应的一组基,还能用某种方式(例如hash)转化成数据结构实现,那么基数排序应该也可以应用。
队列实现是为了保证基数排序的稳定性,放到同一个桶里的整数,先进先出,就以为着当前排序特征相同的元素,排序结束之后的次序和原次序一致。
队列结构直接使用STL标准类queue
#include <cstdio>#include <iostream>#include <queue>using namespace std;#define N 50queue<int>q[10];int n,a[N];int po10[11];void init(){po10[0] = 1;for(int i = 1; i <= 10; i++){po10[i] = po10[i-1]*10;}}int getdig(int n){int dig = 0;while(n){dig++;n/=10;}return dig;}int main(){init();cout<<"Input amounts of numbers in the array.(at most 50 numbers)"<<endl;cin>>n;cout<<"Input "<<n<<" integers divided by a single space(at most 1e10): "<<endl;int dig = 0;for(int i = 0; i < n; i++){cin>>a[i];dig = max(dig, getdig(a[i]));}for(int i = 1; i <= dig; i++)//i-th barrel-sort.{for(int j = 0; j < n; j++){int now = a[j];int k = (int)(now / po10[i-1]) - 10 * (int)(now / po10[i]);if(k < 0 )k=0;q[k].push(now);}int index = 0;for(int j = 0; j < 10; j++){while(!q[j].empty()){int now = q[j].front();q[j].pop();a[index++] = now;}}printf("******\n");printf("Barrel Sort #%d: \n",i);for(int k = 0; k < n; k++){printf("%d ",a[k]);}printf("\n");}printf("The final result: \n");for(int i = 0; i < n; i++)cout<<a[i]<<" ";cout<<endl;}
15个整数排序:将每次排序的结果也输出出来
Input amounts of numbers in the array.(at most 50 numbers)15Input 15 integers divided by a single space(at most 1e10):23 122 033 0 1900 324353 877 254 5905 32 33 122 033 877 899******Barrel Sort #1:0 1900 122 32 122 23 33 324353 33 33 254 5905 877 877 899******Barrel Sort #2:0 1900 5905 122 122 23 32 33 33 33 324353 254 877 877 899******Barrel Sort #3:0 23 32 33 33 33 122 122 254 324353 877 877 899 1900 5905******Barrel Sort #4:0 23 32 33 33 33 122 122 254 877 877 899 1900 324353 5905******Barrel Sort #5:0 23 32 33 33 33 122 122 254 877 877 899 1900 5905 324353******Barrel Sort #6:0 23 32 33 33 33 122 122 254 877 877 899 1900 5905 324353The final result:0 23 32 33 33 33 122 122 254 877 877 899 1900 5905 324353