二分:
很简单最基础的二分加分治
arr 是递增的,每次取中间值和target对比。
如果相等就return
如果比target大,就取前半部分再执行。
如果比target小,就取后半部分再执行。
function midSearch(arr,target,start = 0,end = arr.length-1){if (start>end) return -1const middle = (start+end)/2if (arr[middle] = target) return middleif (arr[middle] < target) return midSearch(arr,target,middle+1,end)if (arr[middle] > target) return midSearch(arr,target,start,middle-1)}
快排:
快排本质是-每次找到一个值,比这个值小的向左,比值大的向右。
循环完一次后这个值的位置就确定了。
之后再以此值为分界,左右数组分别执行同一个方法。
其中:比这个值小的向左,比值大的向右 这个部分很难处理,经常写过了还会在这里翻车。
过程:
1、创建一个index用来记录value应该在第几位,默认值就是开始的位置。
2、每次发现一个比value小的值,证明这个value应该再往后挪一下,所以index++
3、交换逻辑比较不好理解,不好理解的原因是为什么index节点要和当前节点调换,这里我们看,
- index节点每次增加后都会调换一个比value小的值过来=>
- index和index之前的值都是比value小的值,而index之后的都是比value大的值
- 此时index++了,index的值就是比value大的值了,而 i 的值还是比value小的,两者调换,index重新变为比value小的值。
由此可见,start-index 是比value小的值,index-i是比value大的值。一直往后推,推到end,此时就将数组分为 start-index 和 index-end两部分了。
4、循环结束后,index就是value应该待的位置,而且index的值肯定是比value小的值,所以直接换一下就好了。
5、换完把分开的数组分别执行同方法就好了。
function quickSort(nums){function quickSortAss(arr,start,end){if(start>end) returnconst value = arr[start]let index = startfor(let i = start+1,i++,i<=end){if(arr[i]<start){index++[arr[index],arr[i]] = [arr[i],arr[index]]}}arr[start]=arr[index]arr[index]=valuequickSortAss(arr,start,index-1)quickSortAss(arr,index+1,end)}quickSortAss(nums,0,nums.length-1)return nums}
