面试常见算法:快速排序
思路:假设有一个数组:[12,8,15,16,1,24]
1、先找到中间项,把他从原来的数组中移除(这里用Math.floor往下取就是15),获取这一项的结果 15
让数组里面的每一项和中间项 15 继续比较,比15小的放到左边,比15大的放到右边,第一轮比较过后:
左边数组:[12,8,1]
右边数组:[16,24]
2、每一边的数组继续不断重复此操作
最终左边数组:[1,8,12]
最终右边数组:[16,24]
3、最后把左边数组、中间项、右边数组加起来:[1,8,12,15,16,24]
具体代码
function quick(arr){
//4、结束递归(当arr中小于等于一项,则不用处理)
if(arr.length<=1){
return arr;
}
//1、找到数组的中间项,在原有的数组中把它移除//
let middleIndex = Math.floor(arr.length/2);
let middleValue = arr.splice(middleIndex,1)[0];
//2、准备左右两个数组,循环剩下数组中的每一项,比当前项小的放到左边数组
//中,大的放到右边数组中
let arrLeft = [];
let arrRight = [];
for(let i = 0;i < arr.length;i++){
let item = arr[i];
if(item>middleValue){
arrRight.push(item)
}else{
arrLeft.push(item)
}
}
//3、用递归的方式让左右两边的数组持续这样处理,一直到左右两边都排好序
//为止,最后让左边+中间+右边拼接成为最后的结果
return quick(arrLeft).concat(middleValue,quick(arrRight));
}
let array = [32,45,4,12,33];
let result = quick(array);
console.log(result);=> //[4,12,32,33,45]