基础
二分查找
二分查找的基本思想是将n个元素分成大致相等的两部分,取arr[n/2]中间值与x做比较,如果x=arr[n/2],则找到x,算法结束;如果x<arr[n/2],则只要在数组arr的左半部分继续查找x;如果x>arr[n/2],则只要在数组arr的右半部分查找x
arr是所要查找的数组,x是要查找的元素
js
/**
* 二分查找
* @param arr 查找的数组
* @param x 查找的元素
* @returns 查找到返回数组下标,否则返回-1
*/
function binarySearch(arr, x) {
let low = 0 // 首下标
let high = arr.length - 1 // 尾下标
// 只要查找区间起始点和结束点中间还有值(要包括两值相同的情况),就继续进行查找
while (low <= high) {
const mid = (low + high) / 2 // 确定中间值下标
//如果查找值等于中间值
if (x == arr[mid]) {
return mid // 则这个mid值,就是查找到的数组下标
}
//如果查找值小于中间值
else if (x < arr[mid]) {
high = mid - 1 // 则在左半部分查找,需要重新确认区间high的位置
}
// 否则查找值大于中间值
else {
low = mid + 1 // 则在右半部分查找,需要重新确认区间low的位置
}
}
return -1 //没有查找到,返回-1
}
const arr = [1, 3, 5, 6, 7, 8, 9]
const x = 7
console.log(binarySearch(arr, x))
/**
* 二分查找
* @param arr 查找的数组
* @param x 查找的元素
* @returns 查找到返回数组下标,否则返回-1
*/
function binarySearch(arr, x) {
let low = 0 // 首下标
let high = arr.length - 1 // 尾下标
// 只要查找区间起始点和结束点中间还有值(要包括两值相同的情况),就继续进行查找
while (low <= high) {
const mid = (low + high) / 2 // 确定中间值下标
//如果查找值等于中间值
if (x == arr[mid]) {
return mid // 则这个mid值,就是查找到的数组下标
}
//如果查找值小于中间值
else if (x < arr[mid]) {
high = mid - 1 // 则在左半部分查找,需要重新确认区间high的位置
}
// 否则查找值大于中间值
else {
low = mid + 1 // 则在右半部分查找,需要重新确认区间low的位置
}
}
return -1 //没有查找到,返回-1
}
const arr = [1, 3, 5, 6, 7, 8, 9]
const x = 7
console.log(binarySearch(arr, x))
时间复杂度与空间复杂度
时间复杂度并不具体表示代码真正的执行时间,而是表示代码执行时间随数据规模增长的变化趋势,所以,也叫作渐进时间复杂度,简称时间复杂度
时间复杂度与空间复杂度:
https://blog.csdn.net/weixin_39565332/article/details/110868780
markdown数学公式:
https://blog.csdn.net/qq_43713303/article/details/105711878
递归的时间复杂度:
$$ 一层for循环时间复杂度O(n) $$
$$
二层for循环时间复杂度 O(n^2) $$