二分查找法思想

二分查找法思想

  (2012-07-29 21:00:54)
标签: 

二分查找

 

it

分类: 数据结构-C语言

    算法:当数据量很大适宜采用该方法。采用二分法查找时,数据需是排好序的。

  基本思想:假设数据是按升序排序的,对于给定值x,从序列的中间位置开始比较,如果当前位置值等于x,则查找成功;若x小于当前位置值,则在数列的前半段中查找;若x大于当前位置值则在数列的后半段中继续查找,直到找到为止。

  假如有一组数为3,12,24,36,55,68,75,88要查给定的值24.可设三个变量front,mid,end分别指向数据的上界,中间和下界,mid=(front+end)/2.

  1.开始令front=0(指向3),end=7(指向88),则mid=3(指向36)。因为mid>x,故应在前半段中查找。

  2.令新的end=mid-1=2,而front=0不变,则新的mid=1。此时x>mid,故确定应在后半段中查找。

  3.令新的front=mid+1=2,而end=2不变,则新的mid=2,此时a[mid]=x,查找成功。

  如果要查找的数不是数列中的数,例如x=25,当第三次判断时,x>a[mid],按以上规律,令front=mid+1,即front=3,出现front>end的情况,表示查找不成功。

  例:在有序的有N个元素的数组中查找用户输进去的数据x。

  算法如下:

  1.确定查找范围front=0,end=N-1,计算中项mid(front+end)/2。

  2.若a[mid]=x或front>=end,则结束查找;否则,向下继续。

  3.若a[mid]<x,说明待查找的元素值只可能在比中项元素大的范围内,则把mid+1的值赋给front,并重新计算mid,转去执行步骤2;若a[mid]>x,说明待查找的元素值只可能在比中项元素小的范围内,则把mid-1的值赋给end,并重新计算mid,转去执行步骤2。

在顺序表(3,6,8,10,12,15,16,18,21,25,30)中,用二分法查找关键码值11,所需的关键码比较次数为(B)
A. 2
B. 3
C. 4
D. 5


 

二分查找算法(递归与非递归两种方式) 

标签: interview
  30265人阅读  评论(7)  收藏  举报
  分类:

首先说说二分查找法。

二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回1,失败返回对应的数组下标。


采用非递归方式完成二分查找法。Java代码如下所示。

[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1.     /* 
  2.      * 非递归二分查找算法 
  3.      * 参数:整型数组,需要比较的数. 
  4.      */  
  5.     public static int binarySearch(Integer[]srcArray,int des){  
  6.         //第一个位置.  
  7.         int low=0;  
  8.         //最高位置.数组长度-1,因为下标是从0开始的.  
  9.         int high=srcArray.length-1;  
  10.         //当low"指针"和high不重复的时候.  
  11.         while(low<=high){  
  12.             //中间位置计算,low+ 最高位置减去最低位置,右移一位,相当于除2.也可以用(high+low)/2  
  13.             int middle=low+((high-low)>>1);  
  14.         //与最中间的数字进行判断,是否相等,相等的话就返回对应的数组下标.  
  15.         if(des==srcArray[middle]){  
  16.             return middle;  
  17.         //如果小于的话则移动最高层的"指针"  
  18.         }else if(des<srcArray[middle]){  
  19.             high=middle-1;  
  20.         //移动最低的"指针"   
  21.         }else{  
  22.             low=middle+1;  
  23.             }  
  24.         }  
  25.         return-1;  
  26.         }  
  27.       
  28. }  


采用递归方式完成二分查找算法。代码如下所示。


[java]  view plain  copy
 print ? 在CODE上查看代码片 派生到我的代码片
  1. /** 
  2.  * 递归方法实现二分查找法. 
  3.  * @param Array数组 
  4.  * @param low 数组第一位置 
  5.  * @param high 最高 
  6.  * @param key 要查找的值. 
  7.  * @return 返回值. 
  8.  */  
  9. int BinSearch(int Array[],int low,int high,int key)  
  10. {  
  11.     if (low<=high)  
  12.     {  
  13.         int mid = (low+high)/2;  
  14.         if(key == Array[mid])  
  15.             return mid;  
  16.         else if(key<Array[mid])  
  17.             //移动low和high  
  18.             return BinSearch(Array,low,mid-1,key);  
  19.         else if(key>Array[mid])  
  20.             return BinSearch(Array,mid+1,high,key);  
  21.     }  
  22.     else  
  23.         return -1;  
  24. }  

递归思想会被经常用到,更加突出了编程解决问题的高效。







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值