二分查找及插值查找

一、 二分查找

前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。
思想:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找;若给定值大于中间记录关键字,则在中间记录的右半区继续查找。不断重复上述操作,直到查找成功,或者查找区域无记录,查找失败为止。
代码:

public static int interpolationSearch(int array[], int n, int key){
        int low, high, mid;
        low = 0;
        high = n;
        while(low <= high){
            //普通二分查找
            //mid = (low + high) / 2;
            if(key < array[mid]){
                high  = mid -1;
            }else if (key > array[mid]) {
                low = mid + 1;
            }else {
                return mid;
            }
        }
        return 0;
    }

算法时间复杂度:O(logn)

二、 插值查找

前提:线性表中的记录必须是关键码有序,线性表必须采用顺序存储。
思想:将1/2改为((key-array[low]) / (array[high] - array[low]))。假设a[11]={0,1,16,24,35,47,59,62,73,88,99},low=1, high=10,则a[low]=1, a[high]=99,如果我们要找的是key=16时,按原来折半的做法,我们需要四次才可以得到结果,但如果用新办法,只需两次就可以查找到结果,大幅提高了查找的效率。将要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法。
代码:

public static int interpolationSearch(int array[], int n, int key){
        int low, high, mid;
        low = 0;
        high = n;
        while(low <= high){
            //插值查找
            mid = low + ((key-array[low]) / (array[high] - array[low]))*(high - low);
            if(key < array[mid]){
                high  = mid -1;
            }else if (key > array[mid]) {
                low = mid + 1;
            }else {
                return mid;
            }
        }
        return 0;
    }

算法时间复杂度:O(logn)

发布了31 篇原创文章 · 获赞 25 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/s_842499467/article/details/77790834