二分法查找

// typescript版本的
/**
 * 二分法查找
 * @param {Array<number>}  -nums  查找的數組  如[1,2,3,4]
 * @param  {number} key   -需要查找的值  如3
 * @return {number} -返回下標或者-1(未找到)
 */
function binarySearch(nums: Array<Number>, key: Number): Number {
	let l = 0;                // 左邊界 0最小
	let r = nums.length - 1;  // 右邊界 nums.length-1 最大

	// 終止條件左邊
	while (l <= r) {
		let m = l + Math.floor((r - l) / 2);  // 取中間下標
		// let m = Match.floor((l + r) / 2);  // 這種有可能會溢出
		if (nums[m] === key) {
			// 中間值等於所要查找的值
			return m;
		} else if (nums[m] > key) {
			// 中間值大於所要查找的值  右邊界更改
			r = m - 1;
		} else {
			// 中間值小於所要查找的值  左邊界更改
			l = m + 1;
		}
	}
	return -1;
}


// 編譯後的
/**
 * 二分法查找
 * @param {Array<number>}  -nums  查找的數組  如[1,2,3,4]
 * @param  {number} key   -需要查找的值  如3
 * @return {number} -返回下標或者-1(未找到)
 */
function binarySearch(nums, key) {
    var l = 0; // 左邊界 0最小
    var r = nums.length - 1; // 右邊界 nums.length-1 最大
    // 終止條件左邊
    while (l <= r) {
        var m = l + Math.floor((r - l) / 2); // 取中間下標
        // let m = Match.floor((l + r) / 2);  // 這種有可能會溢出
        if (nums[m] === key) {
            // 中間值等於所要查找的值
            return m;
        }
        else if (nums[m] > key) {
            // 中間值大於所要查找的值  右邊界更改
            r = m - 1;
        }
        else {
            // 中間值小於所要查找的值  左邊界更改
            l = m + 1;
        }
    }
    return -1;
}

總結

  1. 二分法只適用於類似[1,2,3,4]的有順序的數組查找。
  2. 二分法時間複雜度O(log2n)。
  3. 二分法核心在於邊界值的判斷,需要靈活運用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章