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