三大算法(三)js实现二分查找
方式1: 递归方式实现:
// 演示数组的二分查找算法: // 前提: // 1, 索引数组; // 2, 数组是已经排好序的了(没排好则用冒泡排序或者选择排序排好)。 var arr = [2, 5, 8]; // , 10, 15, 18, 22, 24, 24, 28, 33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70]; var search = 3; // 具体分析, 可以将该数据修改为不同的值, 比如: 2, 5, 8, // 原理: 每次都找该数组的某一段的中间项, 并跟要找的目标进行"对比" // 1, 如果刚好相等, 则就算找出来了 // 2, 如果中间项比目标大, 就只要去左边的那一半中找(不含中间项) // 3, 如果中间项比目标小, 就只要去右边的那一半中找(不含中间项) // 假设有这么一个函数, 它能够从某个数组arr中的某个下标范围(start---end)中找指定的数据value // 这里, 假设: start一定是不能大于$end, 否则, 我们就认为找不到了! // 使用递归方式 function binary_search(arr, value, start, end) { if (start > end) { return false; } var mid = Math.floor((start + end) / 2); // 取得两个下标中的中间下标(一半位置) 数据个数为偶数时 出现.5情况时向下或向上取下整数 var mid_value = arr[mid]; // 中间项的值 // 如果刚好相等, 则就算找出来了 if (mid_value == value) { return true; } // 如果中间项比目标大, 就只要去左边的那一半中找(不含中间项) else if (mid_value > value) { new_start = start; new_end = mid - 1; return binary_search(arr, value, new_start, new_end); } // 如果中间项比目标小, 就只要去右边的那一半中找(不含中间项) else { new_start = mid + 1; new_end = end; return binary_search(arr, value, new_start, new_end); } } var result = binary_search(arr, search, 0, arr.length - 1); console.log(result); // => false
方式2:无限for循环方式实现
var arr = [ 2, 5, 8, 10, 15, 18, 22, 24, 24, 28, 33, 35, 50, 55, 56, 57, 60, 61, 62, 66, 70, ]; var search = 5; // 具体分析, 可以将该数据修改为不同的值, 比如: 2, 5, 8, var result = bin_search(arr, search, 0, arr.length - 1); console.log(result); // => true // 使用无限for循环方式 function bin_search(arr, value, start, end) { for (i = 1; i > 0; i++) { if (start > end) { return false; } // 找出start和end的中间位置: var mid = Math.floor((start + end) / 2); var mid_value = arr[mid]; if (mid_value == value) { return true; } // 中间值大于要找的目标值, 则只要去中间值的左边找: else if (mid_value > value) { start = start; // 这句代码可以省略不写 end = end - 1; } // 中间值小于要找的目标值, 则只要去中间值的右边找: else if (mid_value < value) { start = mid + 1; end = end; // 这句代码可以省略不写 } } }
浙公网安备 33010602011771号