基本常用查找算法思路及实现
一:基本常用查找算法介绍
1、顺序(线性)查找
2、二分查找/折半查找
3、插值查找
4、斐波那契查找
二:顺序(线性)查找算法
1、顺序查找概述
顺序(线性)查找算法就是从第一个开始,如果中途找到的话可以停止,也可以接着找后边其他数是否还有与之相等的。直到找到最后一个。
给出一个数组{1,2,3,4,5,6,7,8,9},找要找的数,就返回该数的下标。
2、顺序查找代码实现(java)
public class test {
public static void main(String[] args) {
int a[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9};
int res = seqSearch(a, 9);
System.out.println(res);
}
public static int seqSearch(int a[], int value) {
for (int i = 0; i < a.length; i++) {
if (a[i] == value) {
return i;
}
}
return -1;
}
}
结果如下:
3、顺序查找代码实现(C)
#include <stdio.h>
int main(int argc, char *argv[])
{
int seqSearch(int a[], int value,int len);
int a[] = {
1, 2, 3, 4, 5, 6, 7, 8, 9};
int length=sizeof(a)/sizeof(a[0]);
int res = seqSearch(a, 9,length);
printf("要查找的数的下标是:%d\n",res);
return 0;
}
int seqSearch(int a[], int value,int len){
for (int i = 0; i < len; i++) {
if (a[i] == value) {
return i;
}
}
return -1;
}
结果如下:
三:二分查找/折半查找
1、二分查找/折半查找思路
1、首先确定该数组的中间的下标
mid=(left+right)/2
2、然后让需要查找的数findVal和arr[mid]比较
(1)findVal>arr[mid],说明要查找的数在mid的右边,因此需要递归向右查找。
(2)findVal<arr[mid],说明要查找的数在mid的左边,因此需要递归向左查找。
(3)findVal=arr[mid],说明找到,就返回。
什么时候结束递归?
(1)找到就结束递归
(2)递归完整个数组,仍然没有找到findVal,也结束递归,当left>right就需要退出。
2、二分查找代码实现(java)
import java.util.ArrayList;
import java.util.List;
public class test {
public static void main(String[] args) {
int array[] = new int[]{
1, 2, 6, 8, 8, 9};
List lists = binarySearch2(array, 0, array.length - 1, 8);
System.out.println("要查找的数(" + 8 + ")的下标是:" + lists);
}
//找到一个相同的就停止
public static int binarySearch(int a[], int left, int right, int findVal) {
if (left > right) {
return -1;
}
int mid = (left + right) / 2;
int midVal = a[mid];
if (findVal > midVal) {
// 向右递归
return binarySearch(a, mid + 1, right, findVal);
} else if (findVal < midVal) {
// 向左递归
return binarySearch(a, left, mid - 1, findVal);
} else {
return mid;
}
}
public static List binarySearch2(int a[], int left, int right,