1、冒泡排序,时间复杂度O(n2),
// 冒泡排序
function bubbleSort (arr) {
const len = arr.length
for (let i = 0; i < len; i++) { // 共需要排序的位数
for (let j = 0; j < len - i - 1; j++) { // 每次遍历确定最后一位
if (arr[j] > arr[j + 1]) {
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]]
}
}
}
return arr
}
2、快速排序,时间复杂度O(nlogn),是冒泡排序的优化版,将数组切割成左右两块,然后递归调用方法
// 快速排序
function quikSort (arr) {
const len = arr.length
if (len <= 1) return arr;
const midIdx = parseInt(len / 2)
const midVal = arr.splice(midIdx, 1)[0]
const left = [], right = [];
for (let val of arr) {
val < midVal ? left.push(val) : right.push(val)
}
return [...quikSort(left), midVal, ...quikSort(right)]
}
3、归并排序,
时间复杂度O(nlogn),思想:将排序数组无限分割为左右两个数组,直到长度为1,然后开始合并相邻两个数组并排序
// 归并排序
function mergeSort (arr) {
const len = arr.length
if (len <= 1) return arr;
const midIdx = parseInt(len / 2)
const left = mergeSort(arr.slice(0, midIdx))
const right = mergeSort(arr.slice(midIdx))
return merge(left, right)
}
function merge (left, right) {
const lLen = left.length
const rLen = right.length
let l = 0, r = 0, res = [];
while (l < lLen && r < rLen) {
res.push(left[l] < right[r] ? left[l++] : right[r++])
}
return [...res, ...(l === lLen ? right.slice(r) : left.slice(l))]
}
4、选择排序,时间复杂度O(n2),选出最小值,放在排好序的后面一位
// 选择排序
function selectSort (arr) {
for (let i = 0, len = arr.length; i < len; i++) {
let k = i
for (let j = i + 1; j < len; j++) {
if (arr[j] < arr[k]) k = j
}
[arr[k], arr[i]] = [arr[i], arr[k]]
}
return arr
}
5、插入排序,
时间复杂度O(n2),遍历值与前面排好序的值进行比较,交换,最佳情况O(n)
// 插入排序
function insertSort (arr) {
for (let i = 1, len = arr.length; i < len; i++) {
let j = i
const val = arr[j]
while (j > 0 && val < arr[j - 1]) {
[arr[j], arr[j - 1]] = [arr[j - 1], arr[j]]
j--
}
}
return arr
}