算法頭腦
- 1.定義:基數排序根據對位數分組的遞次的差別,LSD(從低位最先)和MSD(從高位最先)基數排序.
- 2.算法思緒(LSD):
第一:定義長度十位數組(桶),寄存排好序的數組;
第二:個位排序,個位大小對應桶編號,然後掏出;
第三:十位排序,十位大小對應桶編號,然後掏出;
第四:百位排序,百位大小對應桶編號,然後掏出,0-1000的排序完成;
- 3.例子:比較
3 0 6 12 12 7 8 12 13 12 8 11 12 4
。
步驟一:以下個位排序,獲得0 11 12 12 12 12 12 3 13 4 6 7 8 8
。
0號桶 [ 0 ]
1號桶 [ 11 ]
2號桶 [ 12, 12, 12, 12, 12 ]
3號桶 [ 3, 13 ]
4號桶 [ 4 ]
5號桶 [ ]
6號桶 [ 6 ]
7號桶 [ 7 ]
8號桶 [ 8, 8 ]
9號桶 [ ]
步驟二:將以上個位排序好的,然後舉行十位排序,獲得0 3 4 6 7 8 8 11 12 12 12 12 12 13
。
0號桶 [ 0, 3, 4, 6, 7, 8, 8 ]
1號桶 [ 11, 12, 12, 12, 12, 12, 13 ]
2號桶 [ ]
3號桶 [ ]
4號桶 [ ]
5號桶 [ ]
6號桶 [ ]
7號桶 [ ]
8號桶 [ ]
9號桶 [ ]
/*
* @Author: yt.gan
* @Date: 2018-04-17 09:53:22
* @Last Modified by: yt.gan
* @Last Modified time: 2018-04-17 10:57:14
*/
//基數排序
function CArray(elements) {
this.dataStore = [];
this.pos = 0;
this.elements = elements;
for (var i = 0; i < this.elements; ++i) {
this.dataStore[i] = i;
}
this.setData = function() {
//天生隨機數
//floor保存整數 random [0,1)
for (var i = 0; i < this.elements; ++i) {
this.dataStore[i] = Math.floor(Math.random() * (this.elements + 1));
}
}
this.clear = function() {
//清空數據
for (var i = 0; i < this.dataStore.length; ++i) {
this.dataStore[i] = 0;
}
}
this.insert = function(element) {
//插進去數據
this.dataStore[this.pos++] = element;
}
this.show = function() {
//裝換為字符串
var reStr = '';
for (var i = 0; i < this.dataStore.length; ++i) {
reStr += this.dataStore[i] + " ";
if (i > 0 & i % 10 == 0) {
reStr += "\n";
}
}
console.log(reStr);
}
this.swap = function(arr, index1, index2) {
//交流位置
var temp = arr[index1];
arr[index1] = arr[index2];
arr[index2] = temp;
}
this.radix = function(arr, maxBit) {
//LSD 從低位最先舉行排序
//maxBit 元素的最高位數
var mod = 10;
var dev = 1;
var temp = [];
for (var i = 0; i < maxBit; i++, dev *= 10, mod *= 10) {
//第一輪mod=10,dev=1 取個位
//第二輪mod=100,dev=10 去十位
for (var j = 0; j < arr.length; j++) {
var bucket = parseInt((arr[j] % mod) / dev);
if (temp[bucket] == null) {
temp[bucket] = [];
}
temp[bucket].push(arr[j]);
}
console.log(temp);
var pos = 0;
for (var j = 0; j < temp.length; j++) {
var value = null;
if (temp[j] != null) {
//從頭最先取
while ((value = temp[j].shift()) != null) {
arr[pos++] = value;
}
}
}
}
}
}
var myNums = new CArray(14);
myNums.setData();
myNums.show();
myNums.radix(myNums.dataStore, 2);
myNums.show();
// 3 0 6 12 12 7 8 12 13 12 8 11 12 4
// [ [ 0 ],
// [ 11 ],
// [ 12, 12, 12, 12, 12 ],
// [ 3, 13 ],
// [ 4 ],
// ,
// [ 6 ],
// [ 7 ],
// [ 8, 8 ] ]
// [ [ 0, 3, 4, 6, 7, 8, 8 ],
// [ 11, 12, 12, 12, 12, 12, 13 ],
// [],
// [],
// [],
// ,
// [],
// [],
// [] ]
// 0 3 4 6 7 8 8 11 12 12 12 12 12 13