zoukankan      html  css  js  c++  java
  • 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为下标的值(此为采用他人回复内容)。

  • 相关阅读:
    GNU make manual 翻译(九十九)
    GNU make manual 翻译( 九十五)
    Shell的 for 循环小例子
    makefile中对目录遍历的小例子
    GNU make manual 翻译(九十三)
    GNU make manual 翻译( 一百)
    GNU make manual 翻译( 九十七)
    GNU make manual 翻译( 九十八)
    mapserver4.8.3 的readme.win32的中文翻译文件
    遥控器编程
  • 原文地址:https://www.cnblogs.com/ponynice/p/12743991.html
Copyright © 2011-2022 走看看