二分:

很简单最基础的二分加分治
arr 是递增的,每次取中间值和target对比。
如果相等就return
如果比target大,就取前半部分再执行。
如果比target小,就取后半部分再执行。

  1. function midSearch(arr,target,start = 0,end = arr.length-1){
  2. if (start>end) return -1
  3. const middle = (start+end)/2
  4. if (arr[middle] = target) return middle
  5. if (arr[middle] < target) return midSearch(arr,target,middle+1,end)
  6. if (arr[middle] > target) return midSearch(arr,target,start,middle-1)
  7. }

快排:

快排本质是-每次找到一个值,比这个值小的向左,比值大的向右。
循环完一次后这个值的位置就确定了。
之后再以此值为分界,左右数组分别执行同一个方法。

其中:比这个值小的向左,比值大的向右 这个部分很难处理,经常写过了还会在这里翻车。
过程:
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、换完把分开的数组分别执行同方法就好了。

  1. function quickSort(nums){
  2. function quickSortAss(arr,start,end){
  3. if(start>end) return
  4. const value = arr[start]
  5. let index = start
  6. for(let i = start+1,i++,i<=end){
  7. if(arr[i]<start){
  8. index++
  9. [arr[index],arr[i]] = [arr[i],arr[index]]
  10. }
  11. }
  12. arr[start]=arr[index]
  13. arr[index]=value
  14. quickSortAss(arr,start,index-1)
  15. quickSortAss(arr,index+1,end)
  16. }
  17. quickSortAss(nums,0,nums.length-1)
  18. return nums
  19. }