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