zoukankan      html  css  js  c++  java
  • 二分查找法详解

    二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。

    二分查找要求:线性表是有序表,即表中结点按关键字有序,并且要用向量作为表的存储结构。不妨设有序表是递增有序的。

    查找过程:首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。

    举例说明:假设有{1,2,3,4,5,6,7,8,9},要求查找元素2在序列中的位置。

    首先,找出序列中间元素为5,2比5小,则在5左边的序列中继续查找;

    这次中间元素为3,2仍比3小,继续在3左边的序列中查找;

    此次中间元素为2,与待查找元素相同,停止查找,返回目标元素的下标。

    具体代码如下:

    int BinarySearch(int a[], int n, int k)
    {
    	int left = 0, right = n - 1, mid;
    	mid = left + ((right - left) / 2);
    	while (left <= right)
    	{
    		if (a[mid] == k)
    			return mid;
    		if (a[mid] > k)
    			right = mid - 1;
    		else
    			left = mid + 1;
    	}
    	if (left > right)
    		return -1;
    }

    另一种函数递归的方法:

    int BinarySearch(int m, int n)
    {
    	int left = m, right = n, mid;
    	mid = left + ((left + right) / 2);
    	if (left > right)
    		return -1;
    	if (a[mid] == k)
    		return mid;
    	if (a[mid] < k)
    		return BinarySearch(mid + 1, n);
    	if (a[mid] > k)
    		return BinarySearch(m, mid - 1);
    }
  • 相关阅读:
    0309. Best Time to Buy and Sell Stock with Cooldown (M)
    0621. Task Scheduler (M)
    0106. Construct Binary Tree from Inorder and Postorder Traversal (M)
    0258. Add Digits (E)
    0154. Find Minimum in Rotated Sorted Array II (H)
    0797. All Paths From Source to Target (M)
    0260. Single Number III (M)
    0072. Edit Distance (H)
    0103. Binary Tree Zigzag Level Order Traversal (M)
    0312. Burst Balloons (H)
  • 原文地址:https://www.cnblogs.com/aerer/p/9931073.html
Copyright © 2011-2022 走看看