二分查找(Java)

二分查找的前提的要查找的数组必须有序.

代码如下:

程序1

 1 public class source {
 2 
 3     public int binary_sort(int[] array, int item) {
 4         int len = array.length;
 5         int min = 0; //定义查找范围的开始
 6         int max = len - 1; //定义查找范围的结尾
 7         while(max > min) { //这里不能等于,不然可能死循环
 8             if(array[min+(max-min)/2] == item) {
 9                 return (int)min+(max-min)/2;
10             }
11             else if(array[min+(max-min)/2] > item) {
12                 max = min+(max-min)/2;
13             }
14             else if(array[min+(max-min)/2] < item) {
15                 min = min+(max-min)/2;
16             }
17         }
18         return -1;
19     }
20     
21     public static void main(String[] args) {
22         int[] a = {1,2,3,4,5,6,7,8,9,10};
23         int n = -1;
24         source sou = new source();
25         System.out.println(sou.binary_sort(a, n));        
26     }
27 }

 

程序复制下来就可以正常执行,这是自己看了原理后写的代码,网上找了例子,也贴上来对比一下

程序2

 1 int binary_sort(int array[], int length, int value)  
 2 {  
 3     if(NULL == array || 0 == length)  
 4         return -1;  
 5   
 6     int start = 0;  
 7     int end = length -1;  
 8   
 9     while(start <= end){  
10           
11         int middle = start + ((end - start) >> 1);  
12         if(value == array[middle])  
13             return middle;  
14         else if(value > array[middle]){  
15             start = middle + 1;  
16         }else{  
17             end = middle -1;  
18         }  
19     }  
20   
21     return -1;  
22 }  

和别人的代码对比发现自己代码的问题:

1.复杂表达式变量应该定义成变量.

2.程序1中开始没有是max = len,没有减一,数组下标问题要注意.同理下面的两句代码.

3.程序2计算平均值没有直接除以2,而是(end - start) >> 1,用了移位操作,这样避免产生小数,而且不用强制类型转换.

 

转载于:https://www.cnblogs.com/hking-jff/p/4192240.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值