一、思想
二分查找:又称折半查找,是顺序查找的优化
查找序列要求:有序
二分查找就是每次取中间位置的数据,将数组分成两部分,将目标值与中间值做比较,大于中间值则下次从右侧数组开始查找,小于中间值,下次从左侧数组开始查找,以此循环,直到中间值即为查找值,范围位置即可。
二、实现代码
非递归:
public static int getX(int[] data, int x) {
int start = 0;
int end = data.length - 1;
if(start>end||data[start]<x||data[end]>x){
return -1;
}
while (start <= end ) {
int mid = (start + end) / 2;
if (data[mid] > x) {
end = mid - 1;
} else if (data[mid] < x) {
start = mid + 1;
}else {
return mid;
}
}
return -1;
}
小结:
第一步先判断不符合要求的数据,如开始的大于结尾的,查找的数不在范围内。
mid属于每次都会变化的数据,要放在循环体中
递归:
public static int getResult(int[] data, int low, int high, int x) {
int mid = (low + high) / 2;
if (data[low] > data[high] || x > data[high] || x < data[low]) {
return -1;
}
if (x < data[mid]) {
high = mid - 1;
return getResult(data, low, high, x);
} else if (x > data[mid]) {
low = mid + 1;
return getResult(data, low, high, x);
} else {
return mid;
}
}
小结:
递归时候整个程序就相当于循环体,做好限制条件,即停止的条件,就可以不断循环。
优化
插值查找:是对二分查找的优化
插值查找:是根据要查找表中最大最小记录的关键字比较后的查找方法,其核心是插值的计算公式:
mid = low + (high-low)(key- a[low] )/(a[high]-a[low])
复杂度为O(logn)
当关键字分布比较均匀的查找来说,插值算法的平均性比这半查找好得多,反之,则不一定