折半查找的改进

本文针对折半查找速度慢的问题,提出了一种三段查找算法,在折半查找的基础上,将搜索区域从两端扩展到三段。

public class LookThree {


private static int index;
private static int[] datas={2,3,7,9,10,34,38,48,56,69,70,81,88,89,101};
public static void main(String[] args) {
long startTime=System.nanoTime();   //获取开始时间  
int x=70;
lookup(x);
System.out.println("index: "+ index);
long endTime=System.nanoTime(); //获取结束时间  
System.out.println("程序运行时间: "+(endTime-startTime)+"ns"); 
}

/**
* 将折半查找分成三段
* @param x
*/
private static void lookup(int x){
int mid1Index; //第一个拆分点
int mid2Index; //第二个拆分点
int leftIndex=0;
int rightIndex=datas.length-1;

while(leftIndex<=rightIndex){
if((rightIndex-leftIndex)<=2){
mid1Index=leftIndex+1*((rightIndex-leftIndex)/2);
mid2Index=leftIndex+2*((rightIndex-leftIndex)/2);
}else{
mid1Index=leftIndex+1*((rightIndex-leftIndex)/3);
mid2Index=leftIndex+2*((rightIndex-leftIndex)/3);
}

if(datas[mid1Index]>x){ //如果第一个拆分点的元素大于目标元素,则将查找范围压缩到第一个区域
rightIndex=mid1Index-1;
}else if(datas[mid1Index]<x && datas[mid2Index]>x){ //压缩到第二个区域
leftIndex=mid1Index+1;
rightIndex=mid2Index-1;
}else if(datas[mid2Index]<x){//压缩到第三个区域
leftIndex=mid2Index+1;
}else if(datas[mid1Index]==x){
index=mid1Index;
return;
}else if(datas[mid2Index]==x){
index=mid2Index;
return;
}
}
}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值