js實現二分查找算法


  二分查找:是一種搜索某個值的索引的算法。

  基本條件:有序的數組。

  思路:1.將數組折半,分成左右兩個數組。

     2.判斷要查找的數和中間位置數值的大小,來判斷要查找的數實在哪一半。

     3.之后繼續折半查找,直至找到這個數。

  方法:二分查找有兩種方法,一種是非遞歸方式,采用while方式,判斷是否符合要求。另一種是采用遞歸方式,采用if方式,依次遞歸,找到相應的值。

  步驟一(非遞歸):

 
         
/**
 * 
 * @param {*} arr 已排好的數組
 * @param {*} key 想要查找的值
 */
function binary_search(arr, key) {
    var low = 0,
        high = arr.length - 1;

    while (low <= high) {
        var mid = parseInt((high + low) / 2);
        if (key == arr[mid]) {
            return mid;
        } else if (key > arr[mid]) {
            low = mid + 1;
        } else if (key < arr[mid]) {
            high = mid - 1;
        } else {
            return -1;
        }
    }
}

  步驟二 (遞歸):

 
         
/**
 * 
 * @param {*} arr 已排好的數組
 * @param {*} low 第一個值的索引
 * @param {*} high 最后一個值的索引
 * @param {*} key 想要查找的值
 */
function binary_search(arr,low,high,key){
  if (low > high) {
      return -1;
  }
  var mid = parseInt((high + low) / 2);
  if (arr[mid] == key) {
      return mid;
  } else if (arr[mid] > key) {
      high = mid - 1;
      return binary_search(arr, low, high, key);
  } else if (arr[mid] < key) {
      low = mid + 1;
      return binary_search(arr, low, high, key);
  }

}
 

  時間復雜度:總共有n個元素,漸漸跟下去就是n,n/2,n/4,....n/2^k,其中k就是循環的次數,由於你n/2^k取整后>=1,即令n/2^k=1,可得k=log2n,(是以2為底,n的對數)

        O(log2n) => O(logn)

  優點:比較次數少,查找速度快,平均性能好。

  缺點:要求待查表為有序表,且插入刪除困難。

  結論:適用於不經常變動而查找頻繁的有序列表。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM