折半查找

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package com.Lucky.base;
/*
折半查找:
         前提:  必须是由顺序的排列
 
 
        案例:找值为150的数据
 
         思路解析:  0   1   2   3   4   5   6    7   【顺序】
                  10  20  45  56  88  99  150  189    【值】
         第一步:  (0+7)/2=3.5 -->3   找到顺序为3的值{56}与150比较  如果小于就进行下一步
         第二步:  ( [3+1]+7)/2=5.5 -->5  找到顺序为5的值{99}与150比较  如果小于就进行下一步
         第三步:  ( [5+1]+7)/2=6.5 -->6  找到顺序为6的值{150}与150比较  如果相等就返回
 
 
         案例:找值为45的数据
         思路解析:  0   1   2   3   4   5   6    7   【顺序】
                  10  20  45  56  88  99  150  189    【值】
         第一步:  (0+7)/2=3.5 -->3   找到顺序为3的值{56}与45比较  如果大于就进行下一步
         第二步:  ( 0+[3-1])/2=2  找到顺序为2的值{45}与45比较  如果 如果相等就返回
 
 */
public class halfSelect {
 
 
    public static void main(String[] args) {
            int[] att={1,5,9,44,56,88,99,100,156,566};
 
            int index=OftenMethod(att,9);
            System.out.println("9的索引是:"+index);
        System.out.println("*********************************");
           int index1=OtherMethod(att,100,0,att.length-1);
           System.out.println("100的索引是:"+index1);
    }
 
 
    //常规方法
    public static int OftenMethod(int[] arr,int result){
        int res=-1;
        //没有数据
        if(arr==null){
            return res;
        }
 
        //有数据
        //找到最大索引
        int start=0;
        int end=arr.length-1;
 
        while (start<=end){
            //找到中间索引:inner
            int inner=(start+end)/2;
            //获取中间索引的值
            int val=arr[inner];
 
            //比较中间值val与目标值result,并修改下一次的start或end索引
            if(val>result){
               end=inner-1;
            }else if(val<result){
                start=inner+1;
            }else {
                return inner;
            }
        }
        return res;
    }
 
    //递归
    public static int OtherMethod(int[] arr,int result,int start,int end){
        int re=-1;
        int startNum=start;
        int endNum=end;
            if(arr==null){
                return re;
            }
            if(start>end){    //结束递归的条件
                return re;
            }
        //找到中间索引:inner
        int inner=(start+end)/2;
        //获取中间索引的值
        int val=arr[inner];
 
        //比较中间值val与目标值result,并修改下一次的startNum或endNum索引
        if(val>result){
            endNum=inner-1;
            return OtherMethod(arr,result,startNum,endNum);
 
        }else if(val<result){
            startNum=inner+1;
            return OtherMethod(arr,result,startNum,endNum);
 
        }else {
            return inner;
        }
 
    }
}

  

posted @   唯易人生  阅读(18)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示