java实现的二分查找

package javal.util.test;

public class TowFind {
	
	public static void main(String[] args) {
		System.out.println(find(new long[] {1,2,3,4,5,6,7,8},8));
	}
	
	public static int find (long[] array,long searchKey) {
		int lowerBound = 0;
		int upperBound =array.length;
		
		int curIn;
		
		while(true) {
			curIn = (lowerBound + upperBound) /2;
			if (array[curIn] == searchKey)
			{
				return curIn;
			}
			else if(lowerBound > upperBound)
			{
				return -1; //没有找到该数据
			}
			else
			{
				if(array[curIn] < searchKey) {
					lowerBound = curIn + 1;
				}
				else
				{
					upperBound = curIn -1;
				}
			}
		}
	}
}

        二分查找需要注意的几点:

        1.数组必须是有序的
        2.设置最小查找点min  和最大查找点 max

        3.比较查找目标 tar 与  res=sum(min + max) /2 的值   根据比较结果  改变 最小查找点和最大查找点 

                  如果 tar == res  则返回
                  如果 tar  <  res   则说明  tar 在 [min,res) 之间  即   max = res  - 1  重新查找

                  如果 tar  >  res   则说明  tar 在 (res,max] 之间  即   min =  res +1  重新查找    


如何删除数组中的一个元素

	public static long[] delete(long[] array,long searchKey) {
		int index = find(array,searchKey);
		int len = array.length;
		if(index == -1) {
			return array;
		}
		for(int x=index; x < len-1; x++) {
			array[x] = array[x+1];
		}
		long[] arraycopy = new long[len -1];
		arraycopy=Arrays.copyOf(array, len -1);
		return arraycopy;
	}

        有序数组查找速度要比无序数组快,但是插入操作中由于所有靠后的数据都需要移动腾出地方,所以速度较慢,有序数组和无序数组的删除操作都很慢,因为数据项必须向前移动来填补已删除数据项的位置。

         ps :已知一个数组的范围,如何求出 使用二分查找的最大次数?
          step = log2 sum
              step : 最大次数
              sum : 数组长度
         或者 step = log10 sum    *  3.322
                

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值