对于初学代码的同学们来说,它可谓是初学代码者的一个噩梦,相当晦涩难懂。笔者在初学代码阶段也是被它深深的教育了,不过现在它成为了我随手写代码时候最喜欢的一个选择。回过头来,对他的理解也逐渐加深。
快速排序核心就在递归,而递归的核心就在一递一归。
- 递:重复对自身进行调用
- 归:找到出口,进行return
function quickSort(arr){
if(arr.length <=1){//递归的出口,如果递归到数组为一个或者零个元素,则返回
return arr //注意!此处不可以 arr.length === 1,举例:假设选取的midIndex为0,在末尾的时候return quickSort(left)也必须返回而不是继续递归下去
}
let midIndex = Math.floor(arr.length/2) //随机选取一个元素
let leftArr=[];//定义一个左数组来存放大的元素
let rightArr=[];//定义一个右数组来存放大的元素
for(let i=0;i<arr.length;i++){
if(i===midIndex) continue //如果遍历到midIndex这个元素,直接跳过
if(arr[i]>=arr[midIndex]){
rightArr.push(arr[i])//遍历到的元素大于选中元素,则push到右边数组
}else{
leftArr.push(arr[i])//小于的时候则push到左边数组
}
}
//进行数组合并 左侧数组+中间数组+右侧数组
return quickSort(leftArr).concat(arr[midIndex],quickSort(rightArr))
}
console.log(quickSort([1,2,3,4,0,5423,32,1,23,435,75]));
总结: 代码或者算法这个东西就是要不断的写,不断的去消化去理解,本人也是从第一次写的时候的一脸懵逼到现在对递归对快排有较深的理解了。