簡單的順序表查找技術java實現

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;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章