鱼说。。。的博客

想想自己的错,就会慢慢忘记别人的过。

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
                

        
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载,转载请标明原文出处。 https://blog.csdn.net/qq_31408331/article/details/79966179
个人分类: 数据结构与算法
上一篇迷茫之后的抉择-java数据结构与算法再学习(1)
下一篇如何表示算法的效率?初识大O表示
想对作者说点什么? 我来说一句

java数组二分查找

2015年11月02日 2KB 下载

没有更多推荐了,返回首页

关闭
关闭