数组排序算法,模仿快速排序。当然达不到O(nlogn)的时间复杂度。
先上快速排序的方法,我比较喜欢这种二分法。
function quick(arr) {
if (arr.length < 2) return arr // 递归出口,长度小于2无需再排序
let midArr = Math.floor(arr.length/2) // 切一半下标
let midNum = arr.splice(midArr, 1)[0]
let [left, right] = [[], []] // 左右数组
for (let i = 0; i < arr.length; i++) {
const el = arr[i];
if (el <= midNum) {
left.push(el)
}else {
right.push(el)
}
}
return quick(left).concat(midNum, quick(right)) // 递归,连接两个数组
}
平时开发没事的时候会对其进行简化增加代码可读性,考虑到以下这种方法。
function quick(arr) {
if (arr.length < 2) return array // 最后递归,递归出口
let last = arr[arr.length - 1] // 最后一个元素
let arrRight = arr.filter((v, i) => v>last) // 右边切(不可相等,考虑最后一个元素)
let arrLeft = arr.filter((v, i) => v<=last && i!= arr.length-1) // 左边切(可相等,考虑两个同样的元素)
return [...quick(arrLeft), last, ...quick(arrRight)]
}