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);
    }
  • 相关阅读:
    [CSP-S模拟测试]:attack(支配树+LCA+bitset)
    [杂题]:C/c(二分答案)
    [杂题]:B/b(二分答案)
    二维莫队(离线)
    [CSP-S模拟测试]:联盟(搜索+树的直径)
    [CSP-S模拟测试]:蔬菜(二维莫队)
    [CSP-S模拟测试]:施工(DP+单调栈+前缀和)
    [CSP-S模拟测试]:画作(BFS+数学)
    [CSP-S模拟测试]:折射(DP)
    [CSP-S模拟测试]:养花(分块)
  • 原文地址:https://www.cnblogs.com/aerer/p/9931073.html
Copyright © 2011-2022 走看看