概述
最容易想到的排序,从旧数组中找到一个最小的,不断放入新的数组中。(不使用数组的slice等方法是因为会使效率变得更慢)
let arr = [3, 5, 6, 7, 1, 2, 4, 9, 8]function getMin(arr) {if (arr == null || arr.length == 0) returnlet index = -1for (let i = 0; i < arr.length; i++) {if (arr[i] != null && arr[i] < arr[index] || arr[i] != null && index == -1) {index = i}}let result = arr[index]arr[index] = nullreturn result
}function sort(arr) {let newArr = new Array(arr.length)for (let i = 0; i < newArr.length; i++) {newArr[i] = getMin(arr)}return newArr
}console.log(sort(arr))
冒泡排序
任何排序的本质都是比较和交换。
let arr = [3, 5, 6, 7, 1, 2, 4, 9, 8]function compare(b, a) {return b > a;
}function exchange(arr, a, b) {let temp = arr[a]arr[a] = arr[b]arr[b] = temp
}function sort(arr) {for (let j = 0; j < arr.length; j++) {// arr.length - 1 - i 单轮比较 索引到倒数第二个数// 外层循环影响内层循环 每次少比较 i 次(末尾的数不断确定)for (let i = 0; i < arr.length - 1 - i; i++) {if (compare(arr[i], arr[i + 1])) {exchange(arr, i, i + 1)}}}
}sort(arr)
console.log(arr)
选择排序
任何一种排序算法,都没有优劣之分,只有适不适合的场景。
越混乱越适合快速排序,越有序越适合冒泡排序。选择排序在性能上居中。
let arr = [3, 5, 6, 7, 1, 2, 4, 9, 8]function compare(b, a) {return b > a;
}function exchange(arr, a, b) {let temp = arr[a]arr[a] = arr[b]arr[b] = temp
}function sort(arr) {for (let j = 0; j < arr.length; j++) {let maxIndex = 0for (let i = 0; i < arr.length - j; i++) {if (compare(arr[maxIndex], arr[i])) {maxIndex = i}}exchange(arr, maxIndex, arr.length - 1 - j)}
}sort(arr)
console.log(arr)
快速排序(浪费性能但精简版)
以下版本浪费了性能,但是极大降低了理解难度。
思路分析:选一个中间值,然后遍历其他值,比中间值大的放一边,比中间值小的放另一边。再分别递归左右数组。
let arr = [3, 5, 6, 7, 1, 2, 4, 9, 8]function quickSort(arr) {if (arr == null || arr.length == 0) return []let middle = arr[0]let left = []let right = []for (let i = 1; i < arr.length; i++) {if (arr[i] < middle) {left.push(arr[i])} else {right.push(arr[i])}}left = quickSort(left)right = quickSort(right)left.push(middle)return left.concat(right)
}
console.log(quickSort(arr))
快速排序(完整版)
let arr = [3, 5, 6, 7, 1, 2, 4, 9, 8]/*** 交换索引为 a 和 b 索引的元素* @param arr* @param a* @param b*/
function swap(arr, a, b) {let temp = arr[a]arr[a] = arr[b]arr[b] = temp
}function quickSort(arr, begin, end) {let left = beginlet right = endwhile (left < right) {while (left < right && arr[right] > arr[begin]) {right--}while (left < right && arr[left] > arr[begin]) {left++}swap(arr, left, right)}if (begin < left - 1) quickSort(arr, begin, left - 1)if (left + 1 < end) quickSort(arr, left + 1, end)swap(arr, begin, left)return arr
}function sort(arr) {return quickSort(arr, 0, arr.length - 1)
}console.log(sort(arr))