java实现数组的折半查找

51 篇文章 3 订阅

/**
 * 数组的查找
 *
 */
public class ThreeDemo {
    
    //获取a第一次出现在数组中的位置,如果返回的是-1,则表示该a在数组中不存在
    public static int getIndex(int[] arr,int a) {
        for(int x=0;x<arr.length;x++) {
            if(arr[x]==a) {
                return x;
            }
        }
        return -1;
    }
    
    /*
     * 折半查找,必须保证数组是有序的
     */
    public static int selfSearch(int[] arr,int key) {
        //定义三个角标,最小,最大,中间值
        int min,max,mid;
        min = 0;
        max = arr.length-1;
        mid = (min+max)/2;
        //如果中间值不等于要查找的元素,就循环
        while(arr[mid] != key) {
            //如果要查找的元素大于中间值,那么最小角标就向前移动,移动的大小就是中间值加1
            if(key > arr[mid]) {
                min = mid+1;
            }else {  //如果要查找的元素小于中间值,那么最大角标就向后移动,移动的大小就是中间值减1
                max = mid-1;
            }
            //如果要查找的元素并不在数组中,也就是最小值大于最大值,返回-1
            if(min>max) {
                return -1;
            }
            mid = (min+max)/2;
        }
        return mid;
    }
    
    //折半的第二种方法
    public static int helfSearch_2(int[] arr,int key) {
        int min = 0,max = arr.length-1,mid;
        while(min<=max) {
            mid = (min+max)/2;
            if(key>arr[mid]) {
                min = mid+1;
            }else if (key<arr[mid]) {
                max = mid-1;
            }else {
                return mid;
            }
        }
        return -1;
    }
    
    public static void main(String[] args) {
        int[] arr = {3,2,1,5,4,2,9};
        int index = getIndex(arr, 2);
        System.out.println(index);
        System.out.println("--------------------------");
        //折半查找
        int[] arrself = {1,3,5,7,9,12,33,56};
        //查找7
        int selfNum = selfSearch(arrself, 7);
        System.out.println(selfNum);
        System.out.println("------------------");
        //折半查找的第二种方式
        int[] arrself_2 = {2,4,6,8,12,14,16};
        //查找14
        int a = helfSearch_2(arrself_2, 14);
        System.out.println(a);
        //查找一个不存在的数字99
        int b = helfSearch_2(arrself_2, 99);
        System.out.println(b);
    }

}
 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

one_smail

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值