# 搜索
# 二分查找
二分查找的基本思想是将长度为 n 的有序数组 a 分成大致相等的两部分,取a[n/2]
与数 x 做比较,如果x = a[n/2]
,则找到 x,算法中止;
如果x < a[n/2]
,则只要在数组 a 的左半部分继续搜索 x,如果x > a[n/2]
,则只要在数组 a 的右半部搜索 x。
二分查找算法的时间复杂度为:log2n
。
function binarySearch(arr, x) {
let lo = 0, hi = arr.length - 1;
while (lo <= hi) {
let mid = Math.floor((hi - lo) / 2) + lo;
if (arr[mid] === x) {
return mid
} else if (arr[mid] < x) {
lo = mid + 1;
} else {
hi = mid - 1;
}
}
return -1;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# leftSearch
返回 x 插入 a 后所在位置的 index,如果 a 中存在与 x 等值的元素,则插入到左侧。
function leftSearch(arr, x) {
let lo = 0, hi = arr.length - 1;
while (lo < hi) {
let mid = Math.floor((hi - lo) / 2) + lo;
if (arr[mid] < x) {
lo = mid + 1;
} else {
hi = mid;
}
}
return [lo, hi];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
# rightSearch
返回 x 插入 a 后所在位置的 index,如果 a 中存在与 x 等值的元素,则插入到右侧。
function rightSearch(arr, x) {
let lo = 0, hi = arr.length - 1;
while (lo < hi) {
let mid = Math.floor((hi - lo) / 2) + lo;
if (x < arr[mid]) {
hi = mid;
} else {
lo = mid + 1;
}
}
return [lo, hi];
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14