文章目录
一、查找算法介绍
在 java 中,我们常用的查找算法有以下四种:
- 顺序(线性)查找
- 二分(折半)查找
- 插值查找
- 斐波那契查找
本文将分别介绍顺序查找、二分查找、插值查找;如要访问斐波那契查找算法的文章请点击链接:斐波那契查找算法 。
二、顺序查找
2.1 什么是顺序查找
顺序查找是按照序列原有顺序对数组进行遍历比较查询的基本查找算法。
从字面意思上就很好理解,顺序查找就是遍历数组一个个比对元素是否与目标值相同。
2.2 顺序查找的代码实现
由于顺序查找太过简单,就不做思路分析了,直接上代码:
/**
* 顺序(线性)查找算法
* @param arr 从本数组中查找
* @param value 要查找的元素
* @return int 查找到的元素的索引
*/
public static int orderSearch(int[] arr, int value){
for (int i=0; i<arr.length; i++){
// 遍历数组
if (value == arr[i]){
// 如果找到,返回索引
return i;
}
}
return -1; // 没有找到,返回 -1
}
三、二分查找
3.1 什么是二分查找
二分查找也称折半查找(Binary Search),它是一种效率较高的查找方法。但是,折半查找要求线性表必须采用顺序存储结构,而且表中元素按关键字有序排列。
3.2 二分查找的基本步骤
二分查找的思想也比较简单,基本步骤如下(假设从数组 arr
中查找目标元素 findValue
):
- 首先确定
arr
的中间元素的下标mid = (left+right)/2
; - 然后让目标元素
findValue
和arr[mid]
比较:- 如果
findValue > arr[mid]
,说明目标元素在mid
的右边,因此需要递归向右查找; - 如果
findValue < arr[mid]
,说明目标元素在mid
的左边,需要向左递归查找; - 如果
findValue == arr[mid]
,说明找到目标元素,返回mid
;
- 如果
- 如果递归完(这里的递归完不是遍历完整个数组,而是在目标元素所在范围内递归)整个数组(即
left > right
)还没找到目标元素,就要退出。
3.3 二分查找的代码实现
二分查找的完整代码实现如下:
-
递归方式实现
/** * 递归方式实现二分查找算法 * @param arr 从此数组中查找目标元素,要求数组升序 * @param left 查找范围左边界 * @param right 查找范围右边界 * @param finalValue 目标元素 * @return int 目标元素在数组的索引 */ public static int binarySearch(int[] arr, int left, int right, int finalValue){ if (left <= right){ // 只有 left <= right 时,才继续查找 int mid = (left + right) / 2; // 中间元素 if (finalValue == arr[mid]