• C语言二分查找法


    参考了C语言中折半查找法(二分法)的实现
    二分查找算法(C语言实现)
    先附上代码

    #include<stdio.h>
    int BinSearch(int arr[],int len,int key)                          //折半查找法(二分法)
    {
    	int low=0;                         //定义初始最小
    	int high=len-1;                 //定义初始最大
    	int mid;                            //定义中间值
    	while(low<=high)
    	{
    		mid=(low+high)/2;              //找中间值
    		if(key==arr[mid])               //判断min与key是否相等
    			return mid;    
    		else if(key>arr[mid])             //如果key>mid  则新区间为[mid+1,high]
    			low=mid+1;
    		else                                       //如果key<mid  则新区间为[low,mid-1]
    			high=mid-1;
    	}
    	return -1;                             //如果数组中无目标值key,则返回 -1 ;
    }
    int main()
    {
    	int arr[]={1,2,3,4,5,6,7,8,9,10,11};                      //首先要对数组arr进行排序
    	printf("%d 
    ",BinSearch(arr,(sizeof(arr)/sizeof(arr[0])),7));
    	return 0;
    }
    

    (此代码为参考博客中复制粘贴的代码)
    一直困惑于为什么不能直接把low=mid或者high=mid,后来看到一个例子,如下:

    若要查找98,如果按照我原本的做法,当low=9,high=10时,mid将会一直等于9,这将一直查找不到98。
    如果按照正确做法,不仅可以直接将所要查找的数不属于的那一部分直接舍去(比如当mid不等于所要查找的数,low=mid+1或者high=mid-1,就可以直接将mid所代表的数在后续判断中舍去),还可以避免两数相除取整一直得到同一个数的bug。
    补充说明:因为mid是中间值,low是有序数组的小端,high是大端,当所查找值k不是数组中间值mid时,如果k<mid,则所查找数组区间就变成[low,mid-1],所以此时high=mid-1;如果k>mid,所查找数组区间为[mid+1,high],此时low=mig+1,数组mid值是直接比较的,k=mid,直接返回以mid为下标的值(此为采用他人回复内容)。

  • 相关阅读:
    使用python3自带工具2to3.py 转换 python2.x 代码 到python3
    python2代码转换python3(2018新)
    解析搜狗词库(python)
    把搜狗输入法词库导入Google拼音输入法
    QT 窗体控件的透明度设置(三种方法)
    Telnet协议详解(远程登陆协议)
    C++游戏开发需要阅读的书籍
    explicit的作用
    C#7.0
    ES6-2
  • 原文地址:https://www.cnblogs.com/ponynice/p/12743991.html
Copyright © 2020-2023  润新知