二分查找及各种变形(JS实现)

179 阅读2分钟

二分查找

这里实现的简单的二分查找(有序数组中不存在重复元素)。

//非递归实现
const binarySearch = (arr, target) => {
	let low = 0, high = arr.length - 1;
	while (low <= high) {
		const mid = parseInt(low + (high - low) / 2);
		if (arr[mid] === target) {
			return mid;
		} else if (arr[mid] > target) {
			high = mid - 1;
		} else {
			low = mid + 1;
		}
	}
	return - 1;
}

//递归实现
const binarySearch = (arr, target) => {
	return helper(arr, 0, arr.length - 1, target);
}

const helper = (arr, low, high, target) => {
	if (low > high) {
		return - 1;
	}
	const mid = low + ((high - low) >> 1);
	if (arr[mid] === target) {
		return mid;
	} else if (arr[mid] < target) {
		return helper(arr, mid + 1, high, target);
	} else {
		return helper(arr, low, mid - 1, target);
	}
}

//测试
var arr1 = [1, 3, 5, 6, 8, 10];
binarySearch(arr1, 3);  //1
binarySearch(arr1, 10); //5
binarySearch(arr1, 7);  //-1

查找第一个值等于给定值的元素(存在重复元素)

const binarySearch1 = (arr, target) => {
	let low = 0, high = arr.length - 1;
	while (low <= high) {
		const mid = low + ((high - low) >> 1);
		if (arr[mid] > target) {
			high = mid - 1;
		} else if (arr[mid] < target) {
			low = mid + 1;
		} else {
			if ((mid === 0) || arr[mid - 1] != target) {
				return mid;
			} else {
				high = mid - 1;
			}
		}
	}
	return - 1;
}

//测试
var arr = [1,3,5,6,6,6,8];
binarySearch1(arr,6);//3

查找最后一个值等于给定值的元素(存在重复元素)

const binarySearch2 = (arr, target) => {
	let low = 0, high = arr.length - 1;
	while (low <= high) {
		const mid = low + ((high - low) >> 1);
		if (arr[mid] > target) {
			high = mid - 1;
		} else if (arr[mid] < target) {
			low = mid + 1;
		} else {
			if ((mid === arr.length - 1) || arr[mid + 1] != target) {
				return mid;
			} else {
				low = mid + 1;
			}
		}
	}
	return - 1;
}

//测试
var arr = [1,3,5,6,6,6,8];
binarySearch2(arr,6);//5

查找第一个大于等于给定值的元素

const binarySearch3 = (arr, target) => {
	let low = 0, high = arr.length - 1;
	while (low <= high) {
		const mid = low + ((high - low) >> 1);
		if (arr[mid] >= target) {
			if ((mid === 0) || arr[mid - 1] < target) {
				return mid;
			} else {
				high = mid - 1;
			}
		} else {
			low = mid + 1;
		}
	}
	return - 1;
}

//测试
var arr = [3,4,6,7,10];
binarySearch3(arr,5); //2

查找最后一个小于等于给定值的元素

const binarySearch4 = (arr, target) => {
	let low = 0, high = arr.length - 1;
	while (low <= high) {
		const mid = low + ((high - low) >> 1);
		if (arr[mid] > target) {
			high = mid - 1;
		} else {
			if ((mid === arr.length - 1) || (arr[mid + 1] > target)) {
				return mid;
			} else {
				low = mid + 1;
			}
		}
	}
	return - 1;
}

//测试
var arr = [3,4,6,7,10];
binarySearch4(arr,9);//3

LeetCode相关题

1.二分查找
leetcode-cn.com/tag/binary-…

29.两数相除
leetcode-cn.com/problems/di…

33.搜索旋转排序数组
leetcode-cn.com/problems/se…

34.在排序数组中查找元素的第一个和最后一个位置
leetcode-cn.com/problems/fi…

35.搜索插入位置
leetcode-cn.com/problems/se…

50.Pow(x, n)
leetcode-cn.com/problems/po…

69.x 的平方根
leetcode-cn.com/problems/sq…