思路:以[12, 8, 15, 16, 1, 24]
为例
1、找到中间项(向下取整),从原来数组中移除 15;
2、准备左边的数组和右边的数组;
3、让拿出来的每一项和中间项进行比较,比中间项小的放在左边的数组,比中间项大的放在右边的数组
4、让每一边继续不断重复此操作
var arr = [12, 8, 15, 16, 1, 24];
function quick(arr) {
// 4. 结束递归(当arr中小于等于一项,则不用处理)
if (arr.length <= 1) {
return arr;
}
// 1.找到数组的中间项,在原有的数组中把他溢出
let middleIndex = Math.floor(arr.length / 2);
let middleVal = arr.splice(middleIndex, 1)[0];
// 2. 准备左右两个数组,循环剩下数组中的每一项,比当前项小的放到左边数组中,反之放到右边数组中
let arrLeft = [],
arrRight = [];
for (let i = 0; i < arr.length; i++) {
let item = arr[i];
item < middleVal ? arrLeft.push(item) : arrRight.push(item);
}
// 3. 递归方式让左右两边的数组持续这样处理,一直到左右两边都排好序为止(最后让左边+中间+右边拼接为最后的结果)
return quick(arrLeft).concat(middleVal, quick(arrRight));
}
console.log(quick(arr));