重温基数排序
前幾天沈陽現場賽遇到了一道題,其中的一部分不能用快排,只能用基數排序,當時不會寫基數排序,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]初始化位0 for(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); }
總結
- 上一篇: codeforces National
- 下一篇: 老旧台式机也可升级WiFi6和蓝牙5.1