有序表查找
/* 主函数 */ public class OrderTableSearch { public static void main(String[] args) { int [] a= {0,1,16,24,35,47,59,62,73,88,99}; System.out.println(FibonacciSearch(a, 10, 88)); System.out.println(InsertKeySearch(a, 10, 88)); System.out.println(BinarySearch(a, 10, 88)); }
一、折半查找
/* 折半查找 */ /* 输出:9 */ static int BinarySearch(int [] a, int n, int key){ int low, high, mid; low = 0; high = n; 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; }
二、插值查找
/* 插值排序 */ /* 输出:9 */ static int InsertKeySearch(int [] a, int n, int key){ int low, high, mid; low = 0; high = n; while(low <= high){ /* 插值查找的计算公式 */ mid = 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; }
三、斐波那契查找
/* 斐波那契排序 */ /* 输出:9 */ static int FibonacciSearch(int [] a, int n, int key){ int [] F = {0,1,1,2,3,5,8,13,21,34}; int low, high, mid, i, k; low = 1; high = n; k = 0; while (n > F[k]-1) /* 计算n位于斐波那契数列的位置 */ k++; while (low <= high) { mid = low + F[k-1] -1; if (key < a[mid]){ high = mid - 1; k = k - 1; } else if (key > a[mid]){ low = mid + 1; k = k - 2; } else { if (mid <= n) return mid; else return n; } } return 0; }
四、三种查找方法的比较
平均性能:斐波那契>折半>插值,因为折半查找是加法与除法的运算,插值为四则运算,斐波那契加减运算。