筆者今天學習字尾陣列,發現需要用到基數排序,所以趕緊學習一波。
基數排序是基於關鍵字排序,先比較第乙個關鍵字,再比較第二個關鍵字。。。
舉個栗子:假如我們有一堆數,17,8,25,78,123,512,250
實際操作時,是將依次將個位、十位、百位的相同的數放入同乙個桶中,高位不足補零。然後再從桶中收集元素。
一、先按個位排序,將個位相同的數放入同乙個桶中
0:250
1:2:512
3:4:
5:25
6:7:17
8:8,78
9:然後我們從桶中收集元素依次得到:250,512,25,17,8,78
二、按十位排序,將十位相同的數放入同乙個桶中
0:81:512,17
2:25
3:4:
5:250
6:7:78
8:9:
然後我們從桶中收集元素依次得到:8,512,17,25,250,78
三、最後按百位排序,將百位相同的數放入乙個桶中
0:8,17,25,78
1:2:250
3:4:
5:512
6:7:
8:9:
然後我們從桶中依次收集元素得到:8,17,25,78,250,512
經過如上操作後,陣列變得有序了。
我們來考慮一下**的實現。首先我們要進行多少個關鍵字次排序,也就是最多有多少位數。然後我們要有10個桶分別代表0~9。然後考慮一下我們怎麼收集每個桶中的元素。我們可以模擬乙個大桶,將所有小桶的元素放進去,記錄乙個相對位置,即對應位相同的放在一起,我們可以處理桶中元素個數的字首和,就知道所有元素的對應位相同的數的最後乙個數所在的位置。這樣我們直接將對應位相同的數倒著放進大桶中就完成收集了。
要是你看不同上述過程也沒有關係,我們假設來收集第二次的元素。
0:81:512,17
2:25
3:4:
5:250
6:7:78
8:9:
首先我們得到十位為0的數有1個,十位為1的有2個,十位為2的有1個,十位為5的數有1個,十位為7的數有1個。
我們處理一波字首和,分別得到0:1,1:3,2:4,5:5,7:6
我們倒著收集:
先收集到250 ,由於十位為5,所以放在十位為5的最後乙個位置即5,位置-1,為4,但不會被訪問,因為十位為5的只有乙個
收集512,由於十位為1,所以放在十位為1的最後乙個位置3,位置-1,為2,
收集25,由於十位為2,所以放在十位為2的最後乙個位置4,位置-1,為3
收集17,由於十位為1,所以放在十位為1的上乙個位置的前乙個,即2,位置-1,為1
收集8:由於十位為0,所以放在十位為0的最後乙個位置1,位置-1,為0
收集78:由於十位為7,所以放在十位為7的最後乙個位置6,位置-1,為5
位置-1:下一次相同位相同的數應該放在的位置,由於我們提前處理了字首和,所以不會位置越界。
按位置收集以後得到:8,17,512,25,250,78
#includeusing namespace std;
const int maxn = 10000 + 7;
int a[maxn]; // 待排序陣列
int n; // 個數
int c[10]; // 小桶
int b[maxn]; // 大桶
int countbit(int *a, int n) // 計算最大位數
} return digit;
}int radixsort(int *a, int n)
for(int j = 1; j < 10; j++) c[j] += c[j-1]; // 每乙個相同數字的第乙個數的位序
for(int j = n - 1; j >= 0; j--)
for(int j = 0; j < n; j++) a[j] = b[j]; // 將大桶中的元素複製回去
radix *= 10; // 比較下一位
} return 0;
}int main()
return 0;
}
排序演算法 基數排序
基數排序 思想 基數排序屬於 分配式排序 分為高位優先法msd和低位優先法lsd 低位優先法lsd 從最低位k0開始排序 對於排好的序列再用次低位k1排序 依次重複,直至對最高位kd 1排好序後,整個序列稱為有序的 這是乙個分 收 分 收 分 收的過程 特點 穩定 空間複雜度 o dn 時間複雜度 ...
排序演算法 基數排序
一 基數排序的思想 不直接比較數與數的大小。把待排序的整數按位分,分為個位,十位 從小到大依次將位數進行排序。實際上分為兩個過程 分配和收集。分配就是 從個位開始,按位數從小到大把資料排好,分別放進0 9這10個桶中 收集就是 依次將0 9桶中的資料放進陣列中 重複這兩個過程直到最高位 二 過程 比...
排序演算法 基數排序
基數排序稱桶排序。它按照記錄的各位值逐步進行排序。適用於整數型別的排序。基數排序不同於別的排序方法通過比較和交換來排序,它是通過按照桶來分配和收集的方法實現的。基本思想 假設待排序的記錄都是m位d進製 不足m位的高位補0 設定d個桶 0,1,d 1 首先將序列中的記錄按照最低位值的大小分配到各個桶中...