比数组的遍历更快速的 ----折半寻找法

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
可观测可视化 Grafana 版,10个用户账号 1个月
简介: 比数组的遍历更快速的 ----折半寻找法

1、折半查找又称为二分查找,是一种效率较高的查找方法。

2、折半查找的前提条件:
查找表中的所有记录是按关键字有序(升序或降序) 。
查找过程中,先确定待查找数字在表中的范围,然后逐步缩小范围(每次将待查记录所在区间缩小一半),直到找到或找不到记录为止。

3、查找的算法可以简述为以下:
用Low、High和Mid表示待查找区间的下界、上界和中间位置指针,初值为Low=1,High=n。
⑴ 取中间位置Mid:Mid=(Low+High)/2;
⑵ 比较中间位置记录的关键字与给定的K值:
① 相等: 查找成功;
② 大于:待查记录在区间的前半段,修改上界指针:High=Mid-1;
③ 小于:待查记录在区间的后半段,修改下界指针:Low=Mid+1;
直到越界(Low>High),查找失败
4.代码演示

public class Homework {
   
    static int []a = new int[5];//定义一个长度为5的一维数组
    static Scanner sr = new Scanner(System.in);//调用输入类Scanner
    public static void main(String[] args) {
   
        iniArray();//给数组赋值
        sortArray();//给数组排序
        int a = sr.nextInt();
        if(searchX(a)) {
   //判断结果
            System.out.println("True");
        }
        else System.out.println("false");
    }
    //给数组赋值
    public static void iniArray(){
   
        for (int i = 0; i <a.length ; i++) {
   
            a[i] = sr.nextInt();
        }
    }
    //给数组元素排序的代码
    public static void sortArray(){
   
        for (int i = 0; i < a.length-1; i++) {
   //最后一个不用再比较,已经是最小的了
            for (int j = 0; j < a.length-1-i; j++) {
   //每次与a[i]比较,前面已经排好序的不用再排所以要减i,减1是因为不用跟自己比
                if(a[j]>a[j+1]){
   
                    int b = a[j];
                    a[j] = a[j+1];
                    a[j+1] = a[j];
                }
            }
        }
    }
    //以下为折半寻找法的具体代码
    public static boolean searchX(int x){
   
            int low = 0,height = a.length-1,middle = (low+height)/2;//首先定义low,height,middle对数组元素进行索引
            while (low<=height){
                                      //循环结束的条件是左边索引值大于右边索引值
                if (x<a[middle]){
                                     //如果寻找的x值小于数组中间值,则右端的height左移到原先的middle的左边
                    height = middle-1;
                    middle = (low+height/2);                       //然后再更新middle值
                }
                else if(x>middle){
                                    //反之亦同
                    low = middle+1;
                    middle = (low+height)/2;
                }
                else return true;
            }
            return false;
        }
}

如有需改进的地方欢迎看官指出

相关文章
|
8月前
【Leetcode -61.旋转链表 -82.删除排序链表中的重复元素Ⅱ】
【Leetcode -61.旋转链表 -82.删除排序链表中的重复元素Ⅱ】
27 0
|
5天前
题目----逆序
题目----逆序
10 0
|
12月前
剑指offer_数组---二维数组中的查找
剑指offer_数组---二维数组中的查找
41 0
|
12月前
剑指offer_数组---数组中的逆序对
剑指offer_数组---数组中的逆序对
32 0
|
12月前
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)上
47 1
|
12月前
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下
27. 移除元素 26. 删除有序数组中的重复项 88. 合并两个有序数组(双指针遍历)下
60 0
|
存储 机器学习/深度学习 缓存
链表和有序二叉树插入元素时真的比数组快吗?
公司有位C++标准委员会的顾问大佬,一年会有几次视频讲座,分享一些编程要点或者经验。很多时候都是C++很基础的方面,但是他的讲解视频真的很深入浅出,有时候会“打破”一些理所应当的观点,这篇文章就是让我觉得很有趣,并且意想不到的地方,在这里分享一下。
链表和有序二叉树插入元素时真的比数组快吗?
【LeetCode】错误的集合&&在排序数组中查找元素的第一个和最后一个位置&&杨氏矩阵&&寻找数组的中心下标&&两个数组的交集
【LeetCode】错误的集合&&在排序数组中查找元素的第一个和最后一个位置&&杨氏矩阵&&寻找数组的中心下标&&两个数组的交集
【LeetCode】错误的集合&&在排序数组中查找元素的第一个和最后一个位置&&杨氏矩阵&&寻找数组的中心下标&&两个数组的交集
|
算法 前端开发 索引
有序的数组,试试用指针法遍历
有序的数组,试试用指针法遍历
61 0