
常用的四类查找算法
顺序查找(线性查询)顺序查找是一种最基础的查找方法,逐一检查数组中的每个元素,直到找到目标值为止。如果没有找到目标值,则返回-1。这种方法简单易懂,但在数据量较大时,效率较低。
发布日期:2021-05-07 20:08:39
浏览次数:18
分类:精选文章
本文共 4833 字,大约阅读时间需要 16 分钟。
顺序查找、二分查找、插值查找和斐波那契查找是数据结构中常见的查找算法,每种算法适用于不同的场景,以下是对每种算法的详细介绍和优化后的内容:
代码示例:
package com.example.datastructureandalgorithm.datastructure.search;public class SeqSearch { public static void main(String[] args) { int[] arr = {1, 9, 11, -1, 34, 89}; int index = seqSearch(arr, -11); if (index == -1) { System.out.println("没有找到"); } else { System.out.println("找到,下标为=" + index); } } public static int seqSearch(int[] arr, int value) { for (int i = 0; i < arr.length; i++) { if (arr[i] == value) { return i; } } return -1; }}
- 二分查找/折半查找二分查找用于有序数组,通过每次将查找范围缩小一半来提高效率。该算法递归地比较目标值与中间元素的值,决定下一步查找的方向。
- 插值查找插值查找结合了二分查找和线性插值的优点,通过计算中间点的位置来加速查找过程。这种方法适用于有序数组,且数据分布较为均匀时效率较高。
- 斐波那契查找(黄金分割法)斐波那契查找利用黄金分割点来减少查找范围,适用于有序数组,尤其是在数据分布较为均匀的情况下。
代码示例:
package com.example.datastructureandalgorithm.datastructure.search;import java.util.ArrayList;import java.util.List;public class BinarySearch { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20}; ListresIndexList = binarySearch2(arr, 0, arr.length - 1, 1); System.out.println("resIndexList=" + resIndexList); } public static int binarySearch(int[] arr, int left, int right, int findVal) { if (left > right) { return -1; } int mid = (left + right) / 2; int midVal = arr[mid]; if (findVal > midVal) { return binarySearch(arr, mid + 1, right, findVal); } else if (findVal < midVal) { return binarySearch(arr, left, mid - 1, findVal); } else { return mid; } } public static List binarySearch2(int[] arr, int left, int right, int findVal) { if (left > right) { return new ArrayList<>(); } int mid = (left + right) / 2; int midVal = arr[mid]; if (findVal > midVal) { return binarySearch2(arr, mid + 1, right, findVal); } else if (findVal < midVal) { return binarySearch2(arr, left, mid - 1, findVal); } else { List resIndexlist = new ArrayList<>(); int temp = mid - 1; while (temp >= 0 && arr[temp] == findVal) { resIndexlist.add(temp); temp--; } resIndexlist.add(mid); temp = mid + 1; while (temp < arr.length && arr[temp] == findVal) { resIndexlist.add(temp); temp++; } return resIndexlist; } }}
代码示例:
package com.example.datastructureandalgorithm.datastructure.search;import java.util.Arrays;public class InsertValueSearch { public static void main(String[] args) { int[] arr = new int[100]; for (int i = 0; i < 100; i++) { arr[i] = i + 1; } int index = insertValueSearch(arr, 0, arr.length - 1, 1234); System.out.println("index = " + index); } public static int insertValueSearch(int[] arr, int left, int right, int findVal) { if (left > right || findVal < arr[0] || findVal > arr[arr.length - 1]) { return -1; } int mid = left + (right - left) * (findVal - arr[left]) / (arr[right] - arr[left]); int midVal = arr[mid]; if (findVal > midVal) { return insertValueSearch(arr, mid + 1, right, findVal); } else if (findVal < midVal) { return insertValueSearch(arr, left, mid - 1, findVal); } else { return mid; } }}
代码示例:
package com.example.datastructureandalgorithm.datastructure.search;public class FibonacciSearch { public static void main(String[] args) { int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; int index = fibonacciSearch(arr, 0, arr.length - 1, 5); System.out.println("index = " + index); } public static int fibonacciSearch(int[] arr, int left, int right, int findVal) { int n = arr.length; if (left > right) { return -1; } // 计算斐波那契数列,直到找到合适的黄金分割点 int a = 0, b = 1, c = 1; int leftIndex = left, rightIndex = right; while (c <= rightIndex - leftIndex) { a = b; b = c; c = a + b; } int goldenPoint = left + (right - left) * a / b; if (arr[goldenPoint] == findVal) { return goldenPoint; } else if (findVal < arr[goldenPoint]) { return fibonacciSearch(arr, left, goldenPoint - 1, findVal); } else { return fibonacciSearch(arr, goldenPoint + 1, right, findVal); } }}
每种查找算法都有其独特的优势和适用场景,选择时需根据具体需求权衡性能和实现复杂度。
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年05月09日 02时25分51秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
github 入门
2019-03-17
HTML 表单验证
2019-03-21
python解释器环境问题
2019-03-21
uni-app快速导入自己需要的插件
2019-03-22
编写xor_shellcode.py
2019-03-22
Echarts笔记
2019-03-22
Ubuntu 20.04 Docker 安装并配置
2019-03-22
在 eclipse 中将 web 项目部署到 tomcat 服务器上
2019-03-22
iOS关于申请公司开发者账号缴费支付
2019-03-22
Laravel 直接返回404页面
2019-03-24
常用元素操作的方法
2019-03-24
解决 matplotlib 中文显示乱码的问题
2023-01-23
解决打开 json 文件中文乱码的问题
2023-01-23
计算机网络基础:PKI(公钥基础设施)
2023-01-23
计算机网络基础:VLAN(虚拟局域网)
2023-01-23
计算机网络基础:文件共享服务器(注册表更改)
2023-01-23
计算机网络基础:用户和组管理
2023-01-23
基于Arduino的ESP32-S3 + OLED(4pin)的文字取模
2023-01-23