• 二进制搜索


    二进制搜索

        二进制搜索(Binary Search)也叫二分查找,是应用于有序表上的一种检索方法。二分检索的思想是:因为序列已经有序,故不须要顺序遍历,每次仅仅需和序列中间位置的元素进行比較就可以。以此确定下次查找的位置。

    显然每次都能够排除一半的元素。非常高效。

    二分检索伪代码

    BinarySearch(Array, key)

    1.low=0,high-n-1;

    2.while(low<=high)

    3.    mid=(low+high)/2;

    4.    if(key<array[mid])

    5.        high=mid-1;

    6.    else if(key>array[mid])

    7.        low=mid+1;

    8.    else

    9.        printf("查找成功!

    ");

    10. printf("查找失败!

    ");

    一个二分检索的样例

    有序序列  2  5  7  9  12  15

    下标      0  1  2  3  4   5

    (i)查找 7

    初始范围 low=0; high=5

    第一次比較 范围[0,5]

    mid=(low+high)/2=2;

    array[2]=7

    5<7,故 high=mid-1;

    第二次比較 范围[0,1]

    mid=(low+high)/2=0;

    array[0]=2

    5>2,故 low=mid+1;

    第三次比較 范围[1,1]

    mid=(low+high)/2=1;

    array[1]=7

    查找成功!

    (ii)查找 6

    初始范围 low=0; high=5

    第一次比較 范围[0,5]

    mid=(low+high)/2=2;

    array[2]=7

    6<7。故 high=mid-1;

    第二次比較 范围[0,1]

    mid=(low+high)/2=0;

    array[0]=2

    6>2,故 low=mid+1;

    第三次比較 范围[1,1]

    mid=(low+high)/2=1;

    array[1]=7

    6<7,故 high=mid-1;

    此时 low=1, high=0; 不符合继续查询的条件。查找失败。

    以下直接用完整的实例给出二分检索在两种查询区间下的代码:

    代码

    #include<stdio.h>
    #include<stdlib.h>
    /*
    二分检索方法一
    前提:序列已经从小到大排序
    检索区间是[low,high]
    */
    bool BinarySearch1(int array[], int n, int key)
    {
    	if (array && n > 0)
    	{
    		int low, high, mid;
    		low = 0, high = n - 1;
    		//查找区间[low,high]。区间不同。high的变化也不同
    		while (low <= high)
    		{
    			/*
    			这样的写法既高效,又可有效的避免溢出问题
    			注意:右移运算符的优先级小于加法运算。所以需加括号
    			*/
    			mid = low + ((high - low) >> 2);
    			if (key < array[mid])
    				high = mid - 1;
    			else if (key > array[mid])
    				low = mid + 1;
    			else//相等,则查找成功
    				return true;
    		}
    	}
    	//序列不存在或查找失败
    	return false;
    }
    /*
    二分检索方法二
    前提:序列已经从小到大排序
    检索区间是[low,high)
    */
    bool BinarySearch2(int array[], int n, int key)
    {
    	if (array && n > 0)
    	{
    		int low, high, mid;
    		//查找区间[low,high)
    		low = 0, high = n;
    		while (low < high)
    		{
    			mid = low + ((high - low) >> 2);
    			if (key < array[mid])
    				high = mid;
    			else if (key > array[mid])
    				low = mid + 1;
    			else
    				return true;
    		}
    	}
    	return false;
    }
    //打印
    void print(int array[], int n)
    {
    	if(array && n>0)
    	{
    		int i;
    		for (i = 0; i < n; i++)
    			printf("%4d",array[i]);
    		printf("
    ");
    	}
    }
    int main()
    {
    	printf("***二分检索***by David***
    ");
    	int array[] = {2,5,7,9,12,15};
    	int n = sizeof(array) / sizeof(array[0]);
    	printf("原序列
    ");
    	print(array, n);
    	int key;
    	key = 7;
    	printf("查找 %d
    ",key);
    	printf("方法一:");
    	BinarySearch1(array, n, key) ? printf("查找成功!
    ") : printf("查找失败!

    "); printf("方法二:"); BinarySearch2(array, n, key) ?

    printf("查找成功!

    ") : printf("查找失败!

    "); printf(" "); key = 6; printf("查找 %d ", key); printf("方法一:"); BinarySearch1(array, n, key) ? printf("查找成功! ") : printf("查找失败! "); printf("方法二:"); BinarySearch2(array, n, key) ? printf("查找成功!

    ") : printf("查找失败!

    "); system("pause"); return 0; }

    执行


       

    有时须要返回查询的下标这时候代码能够这样写

    /*二分检索
    查找成功,返回下标
    否则。返回-1
    查询区间[low, high]
    */
    int BinarySearch(int array[], int n, int key)
    {
    	if (array && n > 0)
    	{
    		int low, high, mid;
    		//查找区间[low,high]
    		low = 0, high = n - 1;
    		while (low <= high)
    		{
    			mid = low + ((high - low) >> 2);
    			if (key < array[mid])
    				high = mid - 1;
    			else if (key > array[mid])
    				low = mid + 1;
    			else//返回下标
    				return mid;
    		}
    	}
    	//查找失败
    	return -1;
    }
        

    能够在while循环中插入一些代码打印low和high。观察low和high的变化,以加深对循环条件的认识。


    转载请注明出处,本文地址;http://blog.csdn.net/zhangxiangdavaid/article/details/37738423


    若有所帮助。顶一个哦!


    专栏文件夹:


    版权声明:本文博客原创文章,博客,未经同意,不得转载。

  • 相关阅读:
    mysql 注意事项 PreparedStatement 对比 statement
    Dbutils commons-dbutils-1.3
    C3P0 mysql 5.7
    servlet-应用mysql-1
    javabean 用integer 而不是int
    servlet-1
    servlet 路径 编码 问题
    mac tomcat 9.0
    case end 的用法
    自定义抛出异常
  • 原文地址:https://www.cnblogs.com/blfshiye/p/4646039.html
Copyright © 2020-2023  润新知