JS算法之排序2

68 阅读1分钟

快速排序和二分排序

快速排序也是一种分而治之的方法,将原始数组分为较小的数组(但它没有像归并排序那样将它们分割开)

大体思路就是先分区后递归

分区:从数组中任意选择一个“基准”,所有比基准小的元素放在基准前面,比基准大的元素放在基准后面。

递归:递归地对基准前后的子数组进行分区处理

function (array){
  const rec = (arr) => {
    if(arr.length === 1){
        return array
    }
    const left = [];
    const right = [];
    const mid = arr[0];
    for(let i = 1; i < arr.length; i += 1){
      if(arr[i] < mid){
         left.push(arr[i])
      }else{
        right.push(arr[i])
      }
    }
    return [...rec(left), mid, ...rec(right)]
  };
  const res = rec(array);
  res.forEach((n, i)=> { this[i] = n})
}

二分搜索的前提是数组有序的,思路是从数组的中间元素开始,如果中间元素正好是目标值,则搜索结束。如果目标值大于或者小于中间元素,则大于或者小于中间元素的那一半数组中搜索

//二分查找
Array.prototype.binarySearch = function(item){
    let low = 0;
    let high = this.length - 1;
    while(low <= high){
        const mid = Math.floor((low + high) / 2);
        const element = this[mid];
        if(element < item){
            low = mid + 1;
        }else if(element > item){
            high = mid - 1;
        }else {
            return mid
        }
    }
    return -1;
}

参考: 慕课网和Javascript数据结构和算法