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