桶排序:
方法一:每個桶隻放相同的數字
入桶過程:
1、 把正數和0存入正數桶,把負數存入負數桶;
2、 把數組中的每項作為正數桶或負數桶的下标存入到對應的
key
裡;
出桶過程:
先周遊正數桶或負數桶,因為桶裡每項都是數組,在周遊每項
function bucketSort(array){
var bucket = [], //正數桶
negativeBucket = [], //負數桶
result = [], //最終結果
abs, //負數的絕對值
k //存儲正數桶或負數桶每項的length
//入桶
for(var i = 0; i < array.length; i++){
if(array[i] < 0){
abs = Math.abs(array[i])
if(!negativeBucket[abs]){
negativeBucket[abs] = []
}
negativeBucket[abs].push(array[i])
}else{
if(!bucket[array[i]]){
bucket[array[i]] = []
}
bucket[array[i]].push(array[i])
}
}
//出桶
var l = negativeBucket.length
for(var i = l - 1; i >= 0; i --){ //周遊負數桶,和正數桶正好相反
if(negativeBucket[i]){
k = negativeBucket[i].length
for(var j = 0; j < k; j++){
result.push(negativeBucket[i][j])
}
}
}
for(var i = 0; i < bucket.length; i++){ //周遊正數桶
if(bucket[i]){
k = bucket[i].length
for(var j = 0; j < k; j++){
result.push(bucket[i][j])
}
}
}
return result
}
var a = [1,23,5,6,7,-6,-9,-11,0,-1,-55,-4,7,4,1,222,3,7]
bucketSort(a)
方法二:每個桶放一個範圍的數
function bucketSort(array, step) {
var result = [], //存儲最終結果
bucket = [], //要用到的桶的數組
bucketCount, //桶的數量
l = array.length,
i,
j,
k,
s,
max = array[0],//最大數
min = array[0],//最小數
temp;
//找出 array 中最大數和最小數
for (i = 1; i < l; i++) {
if (array[i] > max) {
max = array[i]
}
if (array[i] < min) {
min = array[i];
}
}
min = min - 1; //如果 array 中有 4 個數,定義每個桶放 2 個數,那隻要 2 個桶就夠了,最後結果會少一個數,最小數上 -1,需要的桶就會變成 3 個
bucketCount = Math.ceil((max - min) / step); // 需要桶的數量,和 bucket.length相等
console.log(bucketCount)
for (i = 0; i < l; i++) {
temp = array[i];
for (j = 0; j < bucketCount; j++) {
if (temp > (min + step * j) && temp <= (min + step * (j + 1))) { // 判斷放入哪個桶
/*
| j | min + step * j | min + step * (j + 1) |
| 0 | -2 | 0 |
| 1 | 0 | 2 |
| 2 | 2 | 4 |
temp 取值 3,-1,0
j 取值 0,1,2
當 i = 0 時,temp = 3,隻有 j = 2 能進來;
當 i = 1 時,temp = -1,隻有 j = 0 能進來;
當 i = 2 時,temp = 0,隻有 j = 0 能進來
*/
//bucket 是桶的數組,把每個桶變成數組
//這裡 j 的取值順序是 2、1、0,取到的值是 2、0、0
if (!bucket[j]) {
bucket[j] = [];
}
// 通過插入排序将數字插入到桶中的合适位置
s = bucket[j].length; //前兩次 s 是 0,第三次 s 為 1
if (s > 0) { //第三次走這邊
for (k = s - 1; k >= 0; k--) {
if (bucket[j][k] > temp) {
bucket[j][k + 1] = bucket[j][k];
} else {
break;
}
}
bucket[j][k + 1] = temp; //這裡 j 取值 0,也就是說放入第一個桶,k + 1 往後放
}else if(s <= 0) { //前兩次走這邊 bucket 中 key 為 0,2有值了
bucket[j].push(temp);
}
}
}
}
for (i = 0; i < bucketCount; i++) { // 循環取出桶中資料
if (bucket[i]) {
k = bucket[i].length;
for (j = 0; j < k; j++) {
result.push(bucket[i][j]);
}
}
}
return result;
}
var a = [-3,-1,0]
bucketSort(a)
基數排序
排序過程:準備 0-9 号十個桶
第一次循環:
入桶:按個位數排序,依次放入0-9号桶内
出桶:從 0 号桶依次開始,按先入先出的方式出桶
第二次循環
入桶:按十位數排序,依次放入0-9号桶内,位數不夠的補 0
出桶:從 0 号桶依次開始,按先入先出的方式出桶
第三次按百位排序... 第四次按千位排序...
直到全部排完
function radixSort(array){
var bucket = [],
i,
max = array[0];
for(i = 1; i < array.length; i++){
if(array[i] > max){
max = array[i]
}
}
for(i = 0; i < 10; i++){
bucket[i] = []
}
var loop = (max + '').length
for(i = 0; i < loop; i++){
for(j = 0; j < array.length;j++){
var str = array[j] + ''
if(str.length >= i + 1){
var k = str[str.length - i - 1] //找出對應位數,比如 345 這個數,第1次找出個位 5,第2次找出十位數 4,第3次找出百位數 3
bucket[k].push(array[j])
}else{
bucket[0].push(array[j])
}
}
array.splice(0,array.length) //清空數組
for(j = 0; j < 10; j++){
var t = bucket[j].length
for(var g = 0; g < t; g++){
array.push(bucket[j][g])
}
bucket[j] = [] //清空桶
}
}
return array
}
a=[22,3,33,2,1,777]
radixSort(a)