任务描述
本关任务:使用折半方法查找数组中某元素的索引,并统计出查找次数。
相关知识
顺序查找:
顺序查找就是从数组的第一个元素开始,依次比较,直到找到目标数据或查找失败。
顺序查找举例:查找数组中是否存在值 432。

输出结果:
目标值的索引为:7
折半查找:
能使用折半查找的前提是数组中的数据是有序的。
折半查找的原理:
假设查找的数组区间为 [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]。
每一次查找与中间值比较,可以确定是否查找成功,不成功的话下一次查找区间将缩小一半。
折半查找举例:查找数组中是否存在等于 80 的元素。

执行结果:
3
顺序查找和折半查找
在查找速度方面,顺序查找自然是不及折半查找,我们代码中数组的长度比较小,没有太大差距,当数据量较大时,我们就能明显感觉到运行时间差距了。
从另一方面来说,顺序查找对数据要求不高,无需数据按照某种方式排列,也无需指定存储格式,顺序存储可以,链式存储也可以。所以从应用范围来说,顺序查找算法自然会更好。
编程要求
仔细阅读右侧编辑区内给出的代码框架及注释,在 Begin-End 间编写程序代码,使用折半方法查找数组中某元素的索引,并统计出查找次数,具体要求如下:
- 接收给定的数据(如: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 min = 0;
int mid;
int count = 0;
// 接收给定数据
Scanner sc = new Scanner(System.in);
// 定义数组
int[] arr = new int[(sc.nextInt())];
// 给数组赋值
int n = sc.nextInt();
for (int i = 0; i < arr.length; i++) {
arr[i] = sc.nextInt();
}
// 查找给定元素索引,并输出查找次数
int max = arr.length - 1;
mid = (max + min) / 2;
while(true) {
count++;
if(n < arr[mid]) {
max = mid - 1;
} else if(n > arr[mid]) {
min = mid + 1;
} else {
System.out.println("索引值:" + mid + "。查找次数:" + count + "。");
break;
}
if(max < min) {
System.out.println("没有找到");
break;
}
mid = (max + min) / 2;
}
/********** End **********/
}
}
注:题目转自头歌平台,代码自写,仅做参考和记录。
这篇博客介绍了如何在Java中使用折半查找法在一个有序数组中寻找目标值的索引,并统计查找次数。讨论了顺序查找和折半查找的效率差异,强调了折半查找在大数据量时的优势。同时提供了编程要求,要求实现接收数据,创建数组并使用折半查找算法找出目标元素的索引。
2196

被折叠的 条评论
为什么被折叠?



