顺序查找和折半查找

1.顺序查找

顺序查找就是从数组的第一个元素开始,依次比较,直到找到目标数据或查找失败。

顺序查找举例:查找数组中是否存在值 432。

public class FindTest {
    public static void main(String[] args) {
        int i;
        int[] arr={1,2,4,5,54,321,867,432,3};
           for( i=0;i<arr.length;i++){      // 顺序遍历数组中的值
          // 判断是否存在元素432
           if(arr[i]==432){
                System.out.print("目标值的索引为:"+i);
                break;
            }
             if(i==arr.length-1){
                System.out.println("数组中没有对应的值");
            }
         }
    }
}

输出结果:

目标值的索引为:7

2.折半查找

能使用折半查找的前提是数组中的数据是有序的

1)折半查找的原理:

假设查找的数组区间为 [min,max],min 代表起始索引,max 代表结束索引,T 代表需要查找的值。

  • 第一步:确定该区间的中间位置 K;
  • 第二步:将查找的值 T 与 array[k] 比较。若相等,查找成功返回此位置;否则确定新的查找区域,继续折半查找;
  • 第三步:若 array[k]>T,由数组的有序性可知 array[k,k+1,……,max] 中的每个值都大于 T,故新的区间为 array[min,……,K-1],若 array[k]<T,同理可得新的查找区间为 array[k+1,……,max]。

每一次查找与中间值比较,可以确定是否查找成功,不成功的话下一次查找区间将缩小一半。

2)折半查找举例:

查找数组中是否存在等于 80 的元素。

        public static void main(String[] args) {
            int [] arr={5,13,19,21,37,56,64,75,80,88,92};     // 数组必须是有序的    
            // 定义三个变量分别记录最大、最小、中间的查找范围索引值
            int max=arr.length-1;
            int min=0;
            int mid;
            int target=21;
            mid=(max+min)/2;
            while(true) {
                if(target<arr[mid]) {     // 如果目标元素小于中点元素            
                    max = mid-1;     // max向mid前移动
                }
                else if(target>arr[mid]) {     // 如果目标元素大于中点元素     
                    min = mid+1;     // min向mid后移动
                }
                else {
                    System.out.println(mid);     // 找到目标元素
                  break;
                }
                if(max<min) {     // 没有找到的情况
                    System.out.println("没有找到");
                    break;
                }
                mid=(max+min)/2;       // 重新计算中间索引值
            }
        }

执行结果:

3

3)举例:使用折半方法查找数组中某元素的索引,并统计出查找次数

具体要求如下:

接收给定的数据(如:4 88 43 43 98 #…,其中第一个数代表数组长度,第二个数代表需要查找的元素,其余数代表数组元素,# 号用于终止接收数据),遇到 # 号终止接收;
创建数组,使用折半方法查找数组中某元素的索引,并统计出查找次数。

注意:数字分隔符为空格。

测试输入:

6 78 4 34 78 458 488 788 #

预期输出:

索引值:2。查找次数:1。

测试输入:

6 786 4 34 78 458 488 788 #

预期输出:

没有找到

import java.util.Scanner;

public class FindTest {
    public static void main(String[] args) {
		
        // 请在 Begin-End 间编写代码
        /********** Begin **********/
        // 定义变量
        int n,count;
        // 接收给定数据
        Scanner input = new Scanner(System.in);
        n = input.nextInt();
        count = input.nextInt();
        // 定义数组
        int a[]= new int[n];
        // 给数组赋值
       for(int i=0;i<n;i++){
            a[i]=input.nextInt();
        }
        // 查找给定元素索引,并输出查找次数                 
        int max=a.length-1;    // 定义三个变量分别记录最大、最小、中间的查找范围索引值
        int min=0;
        int mid;
        int target=count;
        int t=0;   //记录查找的次数
        mid=(max+min)/2;
        while(true) {
            t++;
            if(target<a[mid]) {     // 如果目标元素小于中点元素            
                max = mid-1;     // max向mid前移动                
            }
            else if(target>a[mid]) {     // 如果目标元素大于中点元素     
                min = mid+1;     // min向mid后移动                
            }
            else {               
                System.out.printf("索引值:%d。查找次数:%d。",mid,t);     // 找到目标元素
              break;
            }
            if(max<min) {     // 没有找到的情况
                System.out.println("没有找到");
                break;
            }
            mid=(max+min)/2;       // 重新计算中间索引值
        }
        /********** End **********/
    }
 }

3.顺序查找和折半查找

查找速度方面,顺序查找自然是不及折半查找,我们代码中数组的长度比较小,没有太大差距,当数据量较大时,我们就能明显感觉到运行时间差距了。

从另一方面来说,顺序查找对数据要求不高,无需数据按照某种方式排列,也无需指定存储格式,顺序存储可以,链式存储也可以。所以从应用范围来说,顺序查找算法自然会更好。

  • 2
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
当然可以!顺序查找折半查找是两种常用的数据结构查找方法。下面是这两种方法的简要介绍: 1. 顺序查找(Sequential Search): 顺序查找也称为线性查找,是一种简单直接的方法。它按照数据元素的逻辑顺序,逐个比较数据元素,直到找到要查找的数据元素为止。顺序查找的时间复杂度为O(n),其中n是数据元素的数量。这种方法适用于数据元素有序的情况,但当数据元素无序时,效率较低。 顺序查找的基本步骤如下: * 从数据结构中的第一个元素开始逐个比较。 * 如果找到了要查找的数据元素,则返回该元素的索引位置。 * 如果遍历完整个数据结构仍未找到,则表示未找到要查找的数据元素。 2. 折半查找(Binary Search): 折半查找也称为二分查找,是一种基于有序数据结构的查找方法。它每次将待查找区间一分为二,根据中间位置的数据元素与目标值进行比较,缩小查找范围,直到找到目标值或区间为空为止。折半查找的时间复杂度为O(log n),其中n是待查找区间的长度。这种方法适用于数据元素已排序的情况,特别是对效率要求较高的场景。 折半查找的基本步骤如下: * 假设当前区间的下界为low,上界为high。 * 如果low >= high,表示区间内不存在目标值,查找结束。 * 在区间内找到一个中间位置mid,如果中间位置的数据元素等于目标值,则查找成功。 * 如果中间位置的数据元素小于目标值,则在左半部分继续查找。 * 如果中间位置的数据元素大于目标值,则在右半部分继续查找。 需要注意的是,折半查找的前提是数据元素已经排序。如果数据元素无序或有大量重复元素,则可能无法达到预期的查找效果。 综上所述,顺序查找折半查找各有优缺点,适用于不同的场景。选择哪种方法取决于具体需求和数据结构的特点。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

848698119

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

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

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

打赏作者

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

抵扣说明:

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

余额充值