JavaScript 二分搜索与插值搜索法
基本流程
1.排序
2.(插值搜索)计算出里待搜索值相近的值(插值搜索)
2.(二分搜索)找出数组中,中间位置的值
3. 截取数组(递归或者循环)
4. 找值 找到了 返回 对应的值
5. 未找到值返回null
下面就是算法
// 1. 我才用的是快速排序算法,你也可以用其他的,这个无所谓
et string = [0, 16, 18, 16, 45, 55, 15, 17, 16]
let l = 0
let r = string.length - 1
// 快速排序
function sort(arrs, l, r) {
let temp
let i = l
let j = r
if(i < j) {
while(i != j) {
temp = arrs[i]
while(j > i && arrs[j] >= temp) {
j--
}
arrs[i] = arrs[j]
while(i < j && arrs[i] <= temp) {
i++
}
arrs[j] = arrs[i]
}
arrs[i] = temp
// 排序左序列
sort(arrs, l, i - 1)
// 排序右序列
sort(arrs, i + 1, r)
}
}
sort(string, l, r)
// 此时 string变量数组已经变成有序的了
// 下面进行二分搜索或者插值搜索
function binarySearch(arr, value) {
// 核心代码 大概计算出可能出现的位置
let i = (value - arr[0]) % (arr[arr.length - 1] - 1)
// (Math.floor((arr.length - 1) / 2)) 二分搜索算法
//(二分搜索和插值搜索 区别就在于这个中间值怎么找)
let middle = arr[i]
// 找到值的出口
if(middle == value) {
return middle
}
// 下面开始递归切数组
// 右边切
if(value > middle) {
return binarySearch(arr.slice(i + 1, arr.length), value)
}
// 左边切
if(value < middle) {
return binarySearch(arr.slice(0, i), value)
}
// 没有找到return null
return null
}
console.log(binarySearch(string, 10))