背景: 前段時間, 某前端校招二面上來就讓寫快排, 當時就懵了, 想着好久之前看過的, 忘了, 血虧. 最後是掛了, 可能第一印象就不行. 如今記錄一下, 也避免你們遇到這種狀況javascript
const numbers = [2, 4, 6, 12, 43, 12, 56, 1]
function insertionSort(arr) {
function binInsert(val, arr) {
if (arr.length === 0) {
return [val]
} else if (arr.length === 1) {
return val > arr[0] ? [arr[0], val] : [val, arr[0]]
} else {
const middle = Math.floor(arr.length / 2)
return val > arr[middle] ?
[...arr.slice(0, middle), ...binInsert(val, arr.slice(middle))] :
[...binInsert(val, arr.slice(0, middle)), ...arr.slice(middle)]
}
}
return arr.reduce((buf, val) => binInsert(val, buf), [])
}
console.log(insertionSort(numbers))
複製代碼
先分解, 後歸併前端
const numbers = [2, 4, 6, 12, 43, 12, 56, 1]
function mergeSort(arr) {
if (arr.length < 2) {
return arr
} else if (arr.length === 2) {
return arr[0] > arr[1] ?
[arr[1], arr[0]] :
[arr[0], arr[1]]
}
else {
const buf = []
const middle = Math.floor(arr.length / 2)
const part0 = mergeSort(arr.slice(0, middle))
const part1 = mergeSort(arr.slice(middle))
for (let i = 0, j = 0; i < part0.length || j < part1.length;) {
const val0 = part0[i]
const val1 = part1[j]
if (val0 && val1) {
if (val0 < val1) {
buf.push(val0)
i++
} else {
buf.push(val1)
j++
}
} else if (val0) {
buf.push(val0)
i++
} else if (val1) {
buf.push(val1)
j++
}
}
return buf
}
}
console.log(mergeSort(numbers))
複製代碼
const numbers = [2, 4, 6, 12, 43, 12, 56, 1]
function bubbleSort(arr) {
if (arr.length < 2) {
return arr
} else {
for (let i = 1; i < arr.length; i++) {
if (arr[i] < arr[i - 1])
[arr[i - 1], arr[i]] = [arr[i], arr[i - 1]]
}
return [...bubbleSort(arr.slice(0, -1)), ...arr.slice(-1)]
}
}
console.log(bubbleSort(numbers))
複製代碼
基準值
less
), 大於基準值的元素也構成一個數組(greater
)less
和greater
都已經排序好了, 鏈接less
, 基準值
, greater
即獲得最終排序好的數組less
和greater
分別應用步驟2, 3, 4const numbers = [2, 4, 6, 12, 43, 12, 56, 1]
function quickSort(arr) {
if (arr.length < 2) {
return arr
} else {
const pivot = arr[0], less = [], greater = []
for (let i = 1; i < arr.length; i++) {
const num = arr[i];
num > pivot ? greater.push(num) : less.push(num)
}
return [...quickSort(less), pivot, ...quickSort(greater)]
}
}
console.log(quickSort(numbers))
複製代碼
四大xxxx有五個顯然是常識java
const numbers = [2, 4, 6, 12, 43, 12, 56, 1]
async function sleepSort(arr) {
const sorted = []
await Promise.all(numbers.map(t => new Promise((res) => {
const timer = setTimeout(() => {
clearTimeout(timer)
sorted.push(t)
res()
}, t)
})))
return sorted
}
sleepSort(numbers).then(sorted => console.log(sorted))
複製代碼