版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/toward_south/article/details/89481144
有序表查找,首先是表内有序,它有以下算法
1.折半查找
2.插值查找
3.斐波那契查找
Java代码实现:
/*
*有序表查找
*/
public class OrderListSearch {
/*
* 折半查找
* 时间复杂度为O(logn)
*
* @param a 数组
* @param n 数组大小
* @param key 要查找的关键字
* @return 返回查找的位置
*/
public static int binarySearch(int[] a, int n, int key) {
int low = 0;
int high = n-1;
int mid =0;
while(low <= high) {
mid = (low + high) /2;
if(key < a[mid]) {
high = mid -1;
}
else if(key > a[mid]) {
low = mid +1;
}
else {
return mid;
}
}
return 0;
}
/*
* 插值查找-根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,核心是插值的计算公式
* key-a[low]/a[high]-a[low]
* 时间复杂度为O(logn)
*
* @param a 数组
* @param n 数组大小
* @param key 要查找的关键字
* @return 返回查找的位置
*/
public static int interpolationSearch(int[] a, int n, int key) {
int low = 0;
int high = n -1;//如果这里high = n 会导致数组越界,而折半查找却没有这个问题
int mid = 0;
while(low <= high) {
mid = (int)(low + (high - low) * (key - a[low])/(a[high] - a[low])); // 插值
if(key < a[mid]) {
high = mid -1;
}
else if(key > a[mid]) {
low = mid +1;
}
else {
return mid;
}
}
return 0;
}
/*
* 斐波那契查找-利用了黄金分割的原理来实现
* 时间复杂度为O(logn)
*
* @param a 数组
* @param n 数组大小
* @param f 斐波那契数列
* @param key 要查找的关键字
* @return 返回查找的位置
*/
public int fibonacciSearch(int[] a,int n,int[] f, int key) {
int low = 0;
int high = n-1;
int mid = 0;
int k = 0;
//计算n位处于斐波那契数列的位置
while(n > f[k -1]-1) {
k++;
}
//将不满的数值补全
for(int i = n;i<f[k]-1;i++) {
a[i] = a[n];
}
while(low <= high) {
mid = low +f[k-1]-1;
if(key < a[mid]) {
high = mid -1;
k--;
}
else if(key > a[mid]) {
low = mid +1;
k -= 2;
}
else {
if(mid <= n) {
return mid;
}
//说明是补全数值
else {
return n;
}
}
}
return 0;
}
/*
* 斐波那契数列实现-动态规划
* @param n 当前序号
* @param 返回当前序号的值
*/
public static int fibonacci(int n) {
if(n <= 0) {
return 0;
}
int[] f= new int[n+1];
f[0] = 0;
f[1] = 1;
for(int i = 2; i <= n;i++) {
f[i] = f[i-1]+f[i-2];
}
return f[n];
}
/*
* 斐波那契数列实现-递归
* @param n 当前序号
* @param 返回当前序号的值
*/
public static int fibonacci2(int n) {
if(n <= 0) {
return 0;
}
if( n == 1) {
return 1;
}
return fibonacci2(n-1)+fibonacci2(n-2);
}