1折半查找技術:簡稱爲二分查找技術。它的前提是,線性表中的記錄必須是關鍵字有序,通常是從小到大有序,線性表必須採用順序存儲。思想:取中間記錄爲比較對象,若給定值與中間記錄的關鍵字相等,則查找成功。若給定值小於中間記錄關鍵字,則在中間記錄的左半區繼續查找;若大於中間記錄關鍵字,則在右半區繼續查找,直到成功爲止。
2插值插值
在二分查找中,mid=(low+high)/2=low+1/2*(high-low)
而改進後
mid=low+(key-arr[low])/(arr[high]-arr[low])(high-low);
對於較大的表,大大提高性能
3斐波拉切查找,利用黃金分割原理,即如果要查找的記錄在右側,則左側的數據都不用判斷了,不斷反覆進行下去。
package Search; public class BinarySearch { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub int arr[]={0,1,16,24,35,47,59,62,73,88,99,0,0,0}; int temp=Fibonacci_search( arr,10,99); if(temp!=0) { System.out.println("查找成功"+temp); } else System.out.println("查找失敗"); } //二分查找算法 public static int Binary_Search(int arr[],int n,int key) { int low,high,mid; low=1;//最低元素索引 high=n;//最高元素索引 int flag=0;//哨兵用來記錄查找次數 while(low<=high) { mid=(low+high)/2; if(key<arr[mid]) { high=mid-1; flag++; } else if(key>arr[mid]) { low=mid+1; flag++; } else return mid; } return 0; } //改進的二分查找算法 public static int chazhiSearch(int arr[],int n,int key) { int low,high,mid; low=1;//最低元素索引 high=n;//最高元素索引 while(low<=high) { //關鍵算法,效率提高不少 mid=low+(high-low)*(key-arr[low])/(arr[high]-arr[low]); if(key<arr[mid]) high=mid-1; else if(key>arr[mid]) low=mid+1; else return mid; } return 0; } //斐波拉切查找算法, public static int Fibonacci_search(int arr[],int n,int key) { //構造一個斐波拉切數列 int F[]=new int[20]; F[0]=0; F[1]=1; for(int j=2;j<F.length;j++) { F[j]=F[j-1]+F[j-2];//遞歸構造斐波拉契數列 } int low,high,mid,i,k; low=1; high=n; k=0; while(n>F[k]-1) k++; for(i=n;i<F[k]-1;i++) arr[i]=arr[n];//必須擴展對象數組的後面幾位元素,否則容易越界 while(low<=high) { mid=low+F[k-1]-1; if(key<arr[mid]) { high=mid-1; k=k-1; } else if(key>arr[mid]) { low=mid+1; k=k-2; } else { if(mid<=n) return mid; else return n; } } return 0; } }