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为下标的值(此为采用他人回复内容)。

  • 相关阅读:
    filter_input() 函数
    php get_magic_quotes_gpc()函数用法介绍
    echo、print、sprint、sprintf输出
    nl2br() 函数
    chop函数
    in_array 查询数组中是否存在某个值
    SQL技巧
    运算符(一)
    JS数据类型
    JS的基本语法与字面量和变量
  • 原文地址:https://www.cnblogs.com/ponynice/p/12743991.html
Copyright © 2011-2022 走看看