基數排序
91, 46, 85, 15, 92, 35, 31, 22
通過基數排序第一次掃描以後, 數字被分配到以下盒子中:
Bin 0:
Bin 1: 91, 31
Bin 2: 92, 22
Bin 3:
Bin 4:
Bin 5: 85, 15, 35
Bin 6: 46
Bin 7:
Bin 8:
Bin 9:
git
根據盒子的順序, 對數字進行第一次排序的結果以下:
91, 31, 92, 22, 85, 15, 35, 46
而後根據十位上的數值再將上次排序的結果分配到不一樣的盒子中:
Bin 0:
Bin 1: 15
Bin 2: 22
Bin 3: 31, 35
Bin 4: 46
Bin 5:
Bin 6:
Bin 7:
Bin 8: 85
Bin 9: 91, 92
最後, 將盒子中的數字取出, 組成一個新的列表, 該列表即爲排好序的數字:
62 | 第 5 章
15, 22, 31, 35, 46, 85, 91, 92
使用隊列表明盒子, 能夠實現這個算法。 咱們須要九個隊列, 每一個對應一個數字。 將全部web
隊列保存在一個數組中, 使用取餘和除法操做決定個位和十位。 算法的剩餘部分將數字加
入相應的隊列, 根據個位數值對其從新排序, 而後再根據十位上的數值進行排序, 結果即
爲排好序的數字。
function Queue() {
this.dataStore = [];
this.enqueue = enqueue;
this.dequeue = dequeue;
this.front = front;
this.back = back;
this.toString = toString;
this.empty = empty;
function enqueue(element) {
this.dataStore.push(element);
}
function dequeue() {
return this.dataStore.shift();
}
function front() {
return this.dataStore[0];
}
function back() {
return this.dataStore[this.dataStore.length-1];
}
function toString() {
var retStr = "";
for (var i = 0; i < this.dataStore.length; ++i) {
retStr += this.dataStore[i] + "\n";
}
return retStr;
}
function empty() {
if (this.dataStore.length == 0) {
return true;
}
else {
return false;
}
}
}
function distribute(nums, queues, n, digit) {
for (var i = 0; i < n; ++i) {
if (digit == 1) {
queues[nums[i]%10].enqueue(nums[i]);
} else {
queues[Math.floor(nums[i] / 10)].enqueue(nums[i]);
}
}
}
function dispArray(arr) {
for (var i = 0; i < arr.length; ++i) {
console.log(arr[i] + " ");
}
}
function collect(queues, nums) {
var i = 0;
for (var digit = 0; digit < 10; ++digit) {
while (!queues[digit].empty()) {
nums[i++] = queues[digit].dequeue();
}
}
}
var queues = [];
for (var i = 0; i < 10; ++i) {
queues[i] = new Queue();
}
var nums = [];
for (var i = 0; i < 10; ++i) {
nums[i] = Math.floor(Math.floor(Math.random() * 101));
}
console.log("Before radix sort: ");
dispArray(nums);
distribute(nums, queues, 10, 1);
console.log("收集數據");
collect(queues, nums);
distribute(nums, queues, 10, 10);
collect(queues, nums);
console.log("\n\nAfter radix sort: ");
dispArray(nums);