1.递归实现
function binarySearch(data, dest, start, end){ var end = end || data.length - 1, start = start || 0, m = Math.floor((start + end) / 2); if(data[m] == dest){ return m; } if(dest < data[m]){ return binarySearch(data, dest, 0, m-1); }else{ return binarySearch(data, dest, m+1, end); } return false; } var arr = [-34, 1, 3, 4, 5, 8, 34, 45, 65, 87]; binarySearch(arr,4); //3 2.非递归实现 function binarySearch(data, dest){ var h = data.length - 1, l = 0; while(l <= h){ var m = Math.floor((h + l) / 2); if(data[m] == dest){ return m; } if(dest > data[m]){ l = m + 1; }else{ h = m - 1; } } return false; } var arr = [-34, 1, 3, 4, 5, 8, 34, 45, 65, 87]; binarySearch(arr,4); //3
以上是一个等比数列,n / 2^k = 1时,k就是查找的次数。即k=log2n,所以时间复杂度为O(logn),这是一种非常高效率的算法。
3.数组中存在重复的数据,怎么找出元素最后一次出现的位置❓
和上边介绍的二分查找思路一样:
function binary_search(arr, key) { var low = 0, high = arr.length - 1; while (low <= high) { var mid = low + ((high - low) >> 1); if (arr[mid] > key) { high = mid - 1; } else if (arr[mid] < key) { low = mid + 1; } else { if ((mid == arr.length - 1) || (arr[mid + 1] != key)) return mid; else low = mid + 1; } } return -1; } var arr = [5,13,19,21,21,37,56,64,75,80,88,92]; var result = binary_search(arr, 21); console.log(result);
// 左开右闭式 function binarySearch(array, start, end, target) { while (start < end) { const mid = Math.floor(start + (end - start) / 2) const middle = array[mid] if (target > middle) { start = mid + 1 } else { end = mid } } return start } console.log(binarySearch([1,2,22], 0, 3, 22))
---------------------