Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1135859
  • 博文数量: 103
  • 博客积分: 1897
  • 博客等级: 上尉
  • 技术积分: 1717
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-19 21:02
文章分类

全部博文(103)

文章存档

2013年(19)

2012年(84)

分类: Java

2012-05-04 11:09:50

 折半查找是我很喜欢的一种查找方式,它代码简单,查询效率很高,时间复杂度是0(log2n).
折半查找是在一个有序的元组中查找元素,它通过关键词与中间值的比较,来查找相关的元素。如果关键词比中间值大,那么就在元组的后半部分查找,反之亦然。很显然,折半查找是基于递归思想的。下面先贴出其递归代码的实现

点击(此处)折叠或打开

  1. public class BinarySearch {
  2.     //折半查找,应确保传进来的数组是有序的
  3.     static int binarySearch(int[] n,int num ,int low,int high){
  4.         
  5.      if(low<=high){
  6.          int mid = (low+high)/2;
  7.          if(n[mid] == num)
  8.              return mid;
  9.          else if(n[mid] > num)
  10.          return      binarySearch(n,num,low,mid-1); //后半部分查找
  11.          else
  12.             return binarySearch(n,num,mid+1,high); //前半部分递归查找
  13.      }
  14.         
  15.         return -1;
  16.     }
  17.     public static void main(String[] arg){
  18.         int n[]={1,2,3,3,3,4,5,6};
  19.         for(int i=0;i<=8;i++)
  20.         {
  21.         
  22.             int flag = binarySearch(n,i,0,n.length-1);
  23.             System.out.println("在数组中查找"+i+" 位置是:"+flag);
  24.         }
  25.         
  26.         
  27.     }

  28. }

运行结果如下
在数组中查找0 位置是:-1
在数组中查找1 位置是:0
在数组中查找2 位置是:1
在数组中查找3 位置是:3
在数组中查找4 位置是:5
在数组中查找5 位置是:6
在数组中查找6 位置是:7
在数组中查找7 位置是:-1
在数组中查找8 位置是:-1
我们知道,递归是很消耗栈空间的,虽然递归的形式简单,易懂,但是如果可以,我们尽量都要求用非递归的形式实现算法,下面是其的非递归形式。

点击(此处)折叠或打开

  1. public class BinarySearch {
  2.     //折半查找,应确保传进来的数组是有序的
  3.     static int binarySearch(int[] n,int num){
  4.         int low = 0;
  5.         int high = n.length-1;
  6.         while(low<=high){
  7.             int mid = (low+high)/2; // 从中间位置开始找
  8.             if(n[mid] == num)
  9.                 return mid;
  10.             else if(n[mid]<num){
  11.                 low=mid+1;
  12.                 }else
  13.                 {
  14.                     high = mid-1;
  15.                 }
  16.         }
  17.         
  18.         return -1;
  19.     }
  20.     public static void main(String[] arg){
  21.         int n[]={1,2,3,3,3,4,5,6};
  22.         for(int i=0;i<=8;i++)
  23.         {
  24.         
  25.             int flag = binarySearch(n,i);
  26.             System.out.println("在数组中查找"+i+" 位置是:"+flag);
  27.         }
  28.         
  29.         
  30.     }

  31. }

好了,其实,折半查找也是有它的缺点的,从上面的例子可以看出,在元组{1,2,3,3,3,4,5,6}中,查找元素3时,只是输出了第一次找到的结果,另外折半查找要求元组的元素是有序的,查找的结果才是正确的。不过总的来说,折半查找还是一种性能卓越的查找算法。
阅读(5449) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~