軟體相容性測試要考慮什麼?鄭州軟體測試機構推薦
阿新 • • 發佈:2022-04-07
二分查詢演算法,也稱折半搜尋演算法,是一種在有序陣列中查詢某一特定元素的搜尋演算法。演算法思想是不斷的縮小查詢範圍:
- 以陣列的中間元素做為分割點,假設變數名為middle;
- 如果要查詢的元素比arr[middle]大,則在middle的右半邊查詢,否則在middle的左半邊查詢;
- 重複上面的兩步
相比普通的順序查詢,除了資料量很少的情況下,二分查詢會比順序查詢更快,區別如下所示:
程式碼實現:
function BinarySearch(arr, target) { if (arr.length <= 1) return -1 // 低位下標 let lowIndex = 0 // 高位下標 let highIndex = arr.length - 1 while (lowIndex <= highIndex) { // 中間下標 const midIndex = Math.floor((lowIndex + highIndex) / 2) if (target < arr[midIndex]) { highIndex = midIndex - 1 } else if (target > arr[midIndex]) { lowIndex = midIndex + 1 } else { // target === arr[midIndex] return midIndex } } return -1 }
另一個版本:
function binarySearch(arr,l,r,target){ if(l> r){ return -1; } let mid = l + Math.floor((r-l)/2) if(arr[mid] === target){ return mid; }else if(arr[mid] < target ){ return binarySearch(arr,mid + 1,r,target) }else{ return binarySearch(arr,l,mid - 1,target) } }
如果陣列中存在重複項,而我們需要找出第一個指定的值,實現則如下:
function BinarySearchFirst(arr, target) { if (arr.length <= 1) return -1 // 低位下標 let lowIndex = 0 // 高位下標 let highIndex = arr.length - 1 while (lowIndex <= highIndex) { // 中間下標 const midIndex = Math.floor((lowIndex + highIndex) / 2) if (target < arr[midIndex]) { highIndex = midIndex - 1 } else if (target > arr[midIndex]) { lowIndex = midIndex + 1 } else { // 當 target 與 arr[midIndex] 相等的時候,如果 midIndex 為0或者前一個數比 target 小那麼就找到了第一個等於給定值的元素,直接返回 if (midIndex === 0 || arr[midIndex - 1] < target) return midIndex // 否則高位下標為中間下標減1,繼續查詢 highIndex = midIndex - 1 } } return -1 }