>[success] # 二分搜索
~~~
1.二分查找针对的是一个有序的数据集合,查找思想有点类似分治思想。
每次都通过跟区间的中间元素对比,将待查找的区间缩小为之前的一半,
直到找到要查找的元素,或者区间被缩小为 0
~~~
* 引用一下《js数据结构与算法第三版图》
![](https://img.kancloud.cn/a9/90/a9905ef164220a74d039b6e97a72e562_385x249.png)
>[danger] ##### 代码实现
~~~
1.二分查找针对的是一个有序的数据集合,下面的案例我将快排的引用注释掉了,
采用了写死的一个案例方式,当然也可以直接用数组自带的sort方法
~~~
~~~
const Compare = {
LESS_THAN: -1,
BIGGER_THAN: 1,
EQUALS: 0
};
function lesserOrEquals(a, b, compareFn) {
const comp = compareFn(a, b);
return comp === Compare.LESS_THAN || comp === Compare.EQUALS;
}
function defaultCompare(a, b) {
if (a === b) {
return Compare.EQUALS;
}
return a < b ? Compare.LESS_THAN : Compare.BIGGER_THAN;
}
// 二分搜索需要先排序
// 查找的数组 要查找的值
function binarySearch(array,value) {
const sortedArray = [1,2,3,6,8,24] ;// 这里才用快排 quickSort(array)
let low = 0;
let height = sortedArray.length-1;
/**
* 如果排序是从小到大
* 如果查询的值大于中间项,说明要查找的值在右侧,那我们最小指针就变成 mid +1
* 如果查询的值小于中间项,说明要查找的值在左侧,那我们最大指针就变成 mid -1
* 如果相等是要找值
位置
*/
while(lesserOrEquals(low,height,defaultCompare)){ // 循环结束的条件当最小值和最大值错位或者相等时候
const mid = Math.floor((low + height)/2) // 先找到中间位置
const element = sortedArray[mid] // 取出对应的中间值
if (defaultCompare(element, value) === Compare.LESS_THAN) { // {7}
low = mid + 1; // {8}
} else if (defaultCompare(element, value) === Compare.BIGGER_THAN) { // {9}
height = mid - 1; // {10}
} else {
return mid; // {11}
}
}
return -1
}
console.log( binarySearch(1,8))
~~~
- 接触数据结构和算法
- 数据结构与算法 -- 大O复杂度表示法
- 数据结构与算法 -- 时间复杂度分析
- 最好、最坏、平均、均摊时间复杂度
- 基础数据结构和算法
- 线性表和非线性表
- 结构 -- 数组
- JS -- 数组
- 结构 -- 栈
- JS -- 栈
- JS -- 栈有效圆括号
- JS -- 汉诺塔
- 结构 -- 队列
- JS -- 队列
- JS -- 双端队列
- JS -- 循环队列
- 结构 -- 链表
- JS -- 链表
- JS -- 双向链表
- JS -- 循环链表
- JS -- 有序链表
- 结构 -- JS 字典
- 结构 -- 散列表
- 结构 -- js 散列表
- 结构 -- js分离链表
- 结构 -- js开放寻址法
- 结构 -- 递归
- 结构 -- js递归经典问题
- 结构 -- 树
- 结构 -- js 二搜索树
- 结构 -- 红黑树
- 结构 -- 堆
- 结构 -- js 堆
- 结构 -- js 堆排序
- 结构 -- 排序
- js -- 冒泡排序
- js -- 选择排序
- js -- 插入排序
- js -- 归并排序
- js -- 快速排序
- js -- 计数排序
- js -- 桶排序
- js -- 基数排序
- 结构 -- 算法
- 搜索算法
- 二分搜索
- 内插搜索
- 随机算法
- 简单
- 第一题 两数之和
- 第七题 反转整数
- 第九题 回文数
- 第十三题 罗马数字转整数
- 常见一些需求
- 把原始 list 转换成树形结构