经典的查找算法
顺序(线性)查找
简介
顺序查找适合于存储结构为顺序存储或链接存储的线性表
基本思想:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
时间复杂度:当查找不成功时,需要n+1次比较,时间复杂度为O(n);所以,顺序查找的时间复杂度为O(n)。
图解
题目要求
有一个数列:{1,8,20,23,34,45,3},如果找到,就提示找到,并给出下标值
代码实现
public class SeqSearch {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
System.out.println("请输入你要查找的值:");
int value = scanner.nextInt();
int[] arr={
1,8,20,23,34,45,3};
System.out.println("输出数组的值:");
System.out.println(Arrays.toString(arr));
int index = seqSearch(arr, value);
if (index==-1) {
System.out.println("没有找到该值!");
}else{
System.out.println("找到该值,下标为:"+index);
}
}
/**
* 线性查找是逐一比对,发现有相同值,就返回下标
* 实现的线性查找到一个满足条件的值
* @param arr
* @param value
* @return
*/
public static int seqSearch(int[] arr,int value){
for (int i = 0; i < arr.length; i++) {
if (arr[i] == value) {
return i;
}
}
return -1;
}
}
结果展示
二分查找/折半查找
简介
说明:元素必须是有序的,如果是无序的则要先进行排序操作。
基本思想:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
复杂度分析:最坏情况下,关键词比较次数为log2(n+1),且期望时间复杂度为O(log2n);
题目要求
要求
请对一个有序数组进行二分查找{1, 5, 7, 10, 324, 2345},输入一个数看看该数组是否存在此数,并且求出下标,如果没有就提示“没有这个数”
思考
当一个有序数组中,有多个相同的数值时,如何将所有的数值都查找到,比如这里的1212.
思路分析
简单思路分析
1.首先确定该数组的中间的下标
mid=(left+right)/2
2.然后让需要查找的数findVal和arr[mid]比较
2.1findVal>arr[mid],说明你要查找的数再mid的右边,因此需要递归的向左查找
2.3findVal==arr[mid]说明找到,就返回
什么时候需要结束递归
1)找到就结束递归
2)递归完整个数组,仍然没有找到findVal,也需要结束递归,当left>right就需要退出
图解
思考思路分析
1.在找到mid索引值,不要马上返回
2.向mid索引值的左边扫描,将所有满足1000的元素的下标加入到集合ArrayList中
3.向mid索引值的右边扫描,将所有满足1000的元素的下标,加入到集合Array List中
4.最后将集合返回
代码展示
public class BinarySearch {
public static void main(String[] args) {
int arr[] = {
1, 5, 7,