第八章:查找
1.概念

查找:

查找方式:


2.顺序表查找
2.1.概念

顺序查找(被查找的序列可以无序)
线性查找又称顺序查找,是一种最简单的查找方法,它的基本思想是从第一个记录开始,逐个比较记录的关键字,直到和给定的K值相等,则查找成功;若比较结果与文件中n个记录的关键字都不等,则查找失败。
由于顺序查找是从头插到尾,所以这种方法的查询时间慢。
2.1.顺序表查找算法

优化——引入哨兵

2.3.举例
图例说明: 原始数据:int[] a={4,6,2,8,1,9,0,3}; 要查找数字:8
找到数组中存在数据8,返回位置。
代码演示:
import java.util.Scanner;
/*
* 顺序查找
*/
public class SequelSearch {
public static void main(String[] arg) {
int[] a={4,6,2,8,1,9,0,3};
Scanner input=new Scanner(System.in);
System.out.println("请输入你要查找的数:");
//存放控制台输入的语句
int num=input.nextInt();
//调用searc()方法,将返回值保存在result中
int result=search(a, num);
if(result==-1){
System.out.println("你输入的数不存在与数组中。");
}
else
System.out.println("你输入的数字存在,在数组中的位置是第:"+(result+1)+"个");
}
//顺序排序算法
public static int search(int[] a, int num) {
for(int i = 0; i < a.length; i++) {
if(a[i] == num){//如果数据存在
return i;//返回数据所在的下标,也就是位置
}
}
return -1;//不存在的话返回-1
}
}
运行截图:
3.有序表查找
3.1.折半查找

![]()
代码演示

代码实现
我以{1,2,3,4,5,6,6,6}这个数组作为被查询序列,下面代码使用情景为序列从小到大排序。
public static List<Integer> binarySearch(int arr[], int left, int right, int findVal) {
int mid = (left + right) / 2;
int midVal = arr[mid];
if (left > right) {//left > right代表序列没有要找的元素
return new ArrayList<Integer>();
}
if (findVal > midVal) {// 查找元素大于中间值,向右递归
return binarySearch2(arr, mid + 1, right, findVal);
}
if (findVal < midVal) {//查找元素小于中间值,向左递归
return binarySearch2(arr, left, mid - 1, findVal);
}
else {//找到被查找元素
List<Integer> list = new ArrayList<Integer>();
int temp = mid - 1;//从查找元素的左边遍历查找是否还有相同元素
while (true) {
if (temp < 0 || arr[temp] != findVal) {//退出左边遍历查找条件
break;
}
list.add(temp);
temp -= 1;
}
list.add(mid);
temp = mid + 1;//从查找元素的右边遍历查找是否还有相同元素
while (true) {
if (temp > right || arr[temp] != findVal) {//退出右边遍历查找条件
break;
}
list.add(temp);
temp += 1;
}
return list;
}
}
3.2.插值查找
其实就是插入法
概念:

原理:

代码实现:
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5, 6, 6, 6, 6 };
List<Integer> list = insertValueSearch(arr, 0, arr.length - 1, 6);
System.out.println("index = " + list);
}
public static List<Integer> insertValueSearch(int arr[], int left, int right, int findVal) {
int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]);
int midVal = arr[mid];
if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) {
return new ArrayList<Integer>();
}
if (findVal > midVal) {
return insertValueSearch(arr, mid + 1, right, findVal);
}
if (findVal < midVal) {
return insertValueSearch(arr, left, mid - 1, findVal);
} else {
List<Integer> list = new ArrayList<Integer>();
int temp = mid - 1;
while (true) {
if (temp < 0 || arr[temp] != findVal) {
break;
}
list.add(temp);
temp -= 1;
}
list.add(mid);
temp = mid + 1;
while (true) {
if (temp > right || arr[temp] != findVal) {
break;
}
list.add(temp);
temp += 1;
}
return list;
}
}
4.线性表索引
4.1.概念


4.2.稠密索引
![]()

4.3.倒排索引

参考资料:https://blog.csdn.net/weixin_44824500/article/details/104760260



浙公网安备 33010602011771号