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

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
云原生网关 MSE Higress,422元/月
简介: 比数组的遍历更快速的 ----折半寻找法

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;
        }
}

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

相关文章
|
5月前
|
存储 Java API
LeetCode------合并两个有序数组(4)【数组】
这篇文章介绍了LeetCode上的"合并两个有序数组"问题,并提供了三种解法:第一种是使用Java的Arrays.sort()方法直接对合并后的数组进行排序;第二种是使用辅助数组和双指针技术进行合并;第三种则是从后向前的双指针方法,避免了使用额外的辅助数组。
LeetCode------合并两个有序数组(4)【数组】
|
5月前
|
算法
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
【算法】二分查找——在排序数组中查找元素的第一个和最后一个位置
|
6月前
|
语音技术
语音识别-----列表的常用操作课后练习讲解,用变量追加,取出第一个,取出最后一个,下标位置,列表的循环遍历,下标+1的写法,len下标可以小于这个值,while循环对index循环的遍历
语音识别-----列表的常用操作课后练习讲解,用变量追加,取出第一个,取出最后一个,下标位置,列表的循环遍历,下标+1的写法,len下标可以小于这个值,while循环对index循环的遍历
|
7月前
|
C++
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
C++数组(定义、遍历、长度、地址、最大值、逆置、冒泡排序)
113 0
|
8月前
|
存储 算法 Java
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
数据结构和算法面试题:给定一个整数数组 nums,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。
99 0
|
8月前
|
算法 程序员 索引
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
【算法训练-二分查找 一】【基本二分】二分查找、在排序数组中查找元素的第一个和最后一个位置
66 0
|
算法
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
【算法专题突破】二分查找 - 在排序数组中查找元素的第一个和最后一个位置(17)
79 0
|
算法
使用遍历方法和分治法求两个数组的值
看似简单的姐数组中的最大值实际上体现了不同的思路本文将以比较数组大小为背景,分别展示普通算法和分治法,通过对比来简述分治法。 问题描述 给定一个整数数组,编写一个算法来找到数组中的最大值和最小值。
84 0
|
算法 C语言 C++
【二分查找】34. 在排序数组中查找元素的第一个和最后一个位置
二分查找是一种高效的查找算法,其时间复杂度为 O(log n)。在许多情况下,我们需要在一个有序数组中找到某个目标值的搜索范围。本文将介绍一种基于二分查找的搜索范围查找算法,该算法能够快速找到目标值在数组中的起始和结束位置。
83 0
剑指offer_数组---二维数组中的查找
剑指offer_数组---二维数组中的查找
67 0