折半查找&&插值查找

来源:互联网 发布:饥荒手机版mt修改数据 编辑:程序博客网 时间:2024/05/22 17:30

折半查找技术,又称为二分查找。它的前提是线性表中的记录必须是关键码有序(通常从小到大有序),线性表必须采用顺序存储。折半查找的基本思想是:在有序表中,取中间记录作为比较对象,若给定值与中间记录的关键字相等,则查找成功;若给定值小于中间记录的关键字,则在中间记录的左半区继续查找,若给定值大于中间记录的关键字,则在中间记录的右半区继续查找。不断重复上述过程,直到查找成功,或所有查找区域无记录,查找失败为止。

int binarySearch(int *a, int n, int key){    int low,high,mid;    low = 1;    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;}

折半查找经过改进之后,可以得到另外一种有序查找算法,插值查找法。插值查找是根据要查找的关键字key与查找表中最大最小记录的关键字比较后的查找方法,其核心就在于插值的计算公式(key - a[low]) / (a[high] - a[low]);

本来mid = (low + high) / 2 = low + (high - low) / 2 ,现在就把1/2替换成了上面的计算公式,但如果数据是极端不均匀的数据,用插值查找未必是很适合的选择。

int binarySearch(int *a, int n, int key){    int low,high,mid;    low = 1;    high = n;    while(low <= high)    {        mid = low + (high - low) * (key - a[low]) / (2 * a[high] - a[low]);        if (key < a[mid])        {            high = mid -1;        }        else if (key > a[mid])        {            low = mid + 1;        }        else            return mid;    }    return 0;}



0 0
原创粉丝点击