前言
以下所有的查找算法全部针对如下问题:
设计一个方法,用于在指定的数组中查找指定的值。若找到,返回下标;否则返回 -1.
算法将会不断补充,欢迎喜欢的小伙伴们持续关注。
如果对你有帮助,欢迎点赞哦!(づ ̄3 ̄)づ╭❤~
方法一:顺序查找
1. 顺序查找是啥?
顺序查找,顾名思义,就是按照从头到尾的顺序遍历一遍数组。
2. 代码实现
public static int sequentialSearch(int arr[], int num){
for (int i = 0; i < arr.length; i++) {
if(arr[i] == num){
return i;
}
}
return -1;
}
public static void main(String[] args) {
System.out.println(sequentialSearch(new int[]{1,2,3,4}, 3));
}
控制台输出结果如下(数组的脚标是从0开始的哦):
方法二:二分查找
1. 二分查找是啥?
有这样的一个数组,数组元素是有序排列的。其内部存储如下元素:4、5、7、8、9。同时蓝色指明的是范围的起始(leftIndex)、橙色是范围的结束(rightIndex)。
现在,我们想要查询 8 是否在数组中。(目的)
首先,我们取出该范围中处在中间位置的元素 7 与 所要查找的 8 进行比较。
我们发现8大于7,此时舍去中间元素的左边部分,只保留右边部分。
继续之前的操作,选出这一部分的中间元素,与8进行比较。
我们发现该元素就是我们所要的元素,返回数组内该元素的下标,二分查找完成。
在整个流程中,我们可以发现每次取出比较都可以舍去现有的一半元素,相较于顺序查找,其效率大大提升。
2. 关键点提炼
仔细观察整个流程我们可以发现有以下几个关键点。
- 确定中间标尺(midIndex)并取出中间元素的值(midValue)。midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);midValue = arr[midIndex]
- 左右标尺的移动。如果我们想要查找的值(targetValue)大于中间元素的值(midValue),即 targetValue > midValue,那么左标尺(leftIndex)移动到中间标尺(midIndex)右边一位,即 leftIndex = midIndex + 1。如果我们想要查找的值(targetValue)小于中间元素的值(midValue),即 targetValue < midValue,那么右标尺(rightIndex)移动到中间标尺左边一位,即rightIndex = midValue - 1。
- 何时停止移动左右标尺。当左右标尺相遇或相错或者我们寻找到了想要查找的目标值,那么我们就可以停止移动标尺了。
3. 代码实现
public static int binarySearch(int[] arr, int targetValue){
// 左右标尺初始化
int leftIndex = 0;
int rightIndex = arr.length - 1;
// 3. 左右标尺移动终止条件之一,左右标尺相遇或相错
while(leftIndex <= rightIndex){
// 1. 确定中间标尺
int midIndex = leftIndex + ((rightIndex - leftIndex) >> 1);
// 1. 取出中间标尺位置的元素
int midValue = arr[midIndex];
// 2. 左右标尺移动
if(targetValue > midValue){ // 查找的值大于中间元素
leftIndex = midIndex + 1; // 移动左标尺
}else if(targetValue < midValue){ // 查找的值小于中间元素
rightIndex = midIndex - 1; // 移动右标尺
}else{ // 3. 查找的值等于中间元素 左右标尺移动终止条件之二
return midIndex;
}
}
return -1; // 3. 没有查找到targetValue
}