重温基数排序

来源:互联网 发布:linux运维工程师工资 编辑:程序博客网 时间:2024/06/05 18:40

前几天沈阳现场赛遇到了一道题,其中的一部分不能用快排,只能用基数排序,当时不会写基数排序,gg,从银滑到了铜。。。。真是血的教训,现在再来回顾一下。

输入n个整数,最大的整数不超过6位,这些数存在a数组里,用基数排序的方法,给这些数排序。

定义下面几个数组:

bs[10]:基数排序的桶

rk[10]:rk[i]表示编号为i的数当前位的排名大小。

y[maxn]:y[i]表示低位排好序的结果

x[maxn]:x[i]表示低位再算上当前位排好序的结果

代码:

int T = 6;for(int i = 0;i < n;++i) y[i] = i;for(int t = 0;t < T;t++){for(int i = 0;i < n;++i) rk[i] = at(a[i],t);//rk[i]表示第i号数字的第t位上的数值,也就是当前要考虑位的数值。for(int i = 0;i < 10;i++) bs[i] = 0;//bs[i]初始化位0for(int i = 0;i < n;i++) bs[rk[y[i]]] ++;//下面一句for(int i = 1;i < 10;++i) bs[i] += bs[i-1];//这两句做完后,第t位上<=i的数字共有bs[i]个for(int i = n-1;i >= 0;--i) x[--bs[rk[y[i]]]] = y[i];//倒着循环是关键!这样可以使得,高位相同时,低位大的在后面。高位不同时,直接以高位为准进行赋值。swap(x,y);}



原创粉丝点击