桶排序
簡單的桶排序
- 栗子
一場考試有5名同學,滿分10分,5名同學得到的分數分別爲5分,3分,5分,2分,8分,請給同學進行排序 - JS簡易版桶排序算法實現
var bucketSort = function(arr, len, rule = 'desc') {
if (!arr || arr.length < 1 || !len) return
let tempArr = new Array(len)
let returnArr = []
for (let i = 0; i < len; i++) tempArr[i] = 0
for (let j = 0; j < arr.length; j++) {
tempArr[arr[j]] += 1
}
if (rule === 'desc') {
for (let i = 0; i < len; i++) {
for (let j = 1; j <= tempArr[i]; j++) {
returnArr.push(i)
}
}
} else {
for (let i = len; i > 0; i--) {
for (let j = 1; j <= tempArr[i]; j++) {
returnArr.push(i)
}
}
}
return returnArr
};
console.log(bucketSort([5,3,5,2,8], 11, 'asc'))
-
學習講解
上述代碼中新建大小爲11的數組,數組下表代表的是成績分佈情況(0到10分)
簡易版桶排序排序思路:將同學的成績按照各自所對應的數組下標“倒進去”,多一個人,桶內數字加一;最後按照桶內數字的大小進行每個下標的循環輸出 -
算法說明
時間複雜度:O(M+N)
時間複雜度說明:
第一個循環–桶的數量—循環M次
待排序的列表循環–同學的分數—循環N次
循環輸出–循環M+N次
整個算法循環M+N+M+N次 = O(2*(M+N)) = O(M+N)
冒泡排序
- JS 實現
var bubbleSort = function(arr) {
if (!arr || arr.length < 1) return
let returnArr = arr
for (let i = 0; i < returnArr.length; i++) {
for (let j = 0; j < returnArr.length; j++) {
if (returnArr[j] > returnArr[j+1]) {
let temp = returnArr[j+1]
returnArr[j+1] = returnArr[j]
returnArr[j] = temp
}
}
}
return returnArr
};
console.log(bubbleSort([8,100,50,22,15,6,1,1000,99,0]))
-
學習講解
冒泡排序的基本思想是:每次比較相鄰的兩個元素,順序錯誤就交換 -
算法說明
時間複雜度:O(N2)