版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013132035/article/details/82662253
线性查找:时间复杂度O(n);适合于存储结构为顺序存储或链接存储的线性表。
原理:顺序查找也称为线形查找,属于无序查找算法。从数据结构线形表的一端开始,顺序扫描,依次将扫描到的结点关键字与给定值k相比较,若相等则表示查找成功;若扫描结束仍没有找到关键字等于k的结点,表示查找失败。
//线性查找
public class LinearSearch{
public static int linearSearch(int num[], int value){
//如果数组有序加上下面这个判断效率会更优
if(num == null || num[0] > value || num[num.length-1] < value){ //不满足条件直接输出
return -1;
}
for(int i = 0; i < num.length; i++){ //查找
if(num[i] == value){
return i;
}
}
return -1;
}
}
二分查找:时间复杂度O(logn);元素必须是有序的
原理:也称为是折半查找,属于有序查找算法。用给定值k先与中间结点的关键字比较,中间结点把线形表分成两个子表,若相等则查找成功;若不相等,再根据k与该中间结点关键字的比较结果确定下一步查找哪个子表,这样递归进行,直到查找到或查找结束发现表中没有这样的结点。
//二分查找
public class BinarySearch{
public static int binarySearch(int num[], int value){
if(num == null || num[0] > value || num[num.length-1] < value){//不符合条件直接输出-1
return -1;
}
int low = 0, middle, high = num.length-1;
while(low <= high){
middle = (low + high) / 2; //折半思想
if(num[middle] == value){ //如果找到直接返回下标
return middle;
}else{
if(num[middle] > value){
high = middle-1;
}else{
low = middle + 1;
}
}
}
return -1;
}
}
插值查找:时间复杂度O(logn),和折半思想一样,在定位mid时与折半略有不同,在大数量时会体现其优势所在。
原理:和折半思路一样。算法精华:middle = low + (value - num[low])/(num[high]-num[low]) * (high - low);
//菲波那切查找
public class ChazhiSearch{
public static int chazhiSearch(int num[], int value){
if(num == null || num[0] > value || num[num.length-1] < value){
return -1;
}
int low = 0, middle, high = num.length-1;
while(low <= high){
middle = low + (value - num[low])/(num[high] - num[low]) * (high-low);
if(num[middle] == value){
return middle;
}else{
if(num[middle] > value){
high = middle - 1;
}else{
low = middle + 1;
}
}
}
return -1;
}
}