折半查找
- 首先用要查找的关键字值(key)与中间位置结点的关键字值(arr[mid])相比较;
- 若比较结果相等,则查找完成;若不相等,再根据要查找的关键字值(key)与该中结点关键值(mid)的大小来确定下一步在那个子表中进行;
- 若待查关键值大于中间结点的关键字值(key > arr[mid])),则应查找中间结点以后的字表,否则(key < arr[mid])),查找中间结点以前的字表;
- 重复步骤1~3,直到找到满足条件的结点,或者明确表中没有这样的结点。
-
图解:
//折半查找
public static void main(String[] args) {
int[] arr = {2,6,3,1,8,9,10};
int index = binarySearch(arr,8);
System.out.print(index);//输出 4
}
/**
*
* @param arr 要进行查找的数组,要求数组必须是有序的
* @param key 要查找的元素
* @return 返回要查找的元素在数组的索引位置, 返回-1表示没找到
*/
public static int binarySearch(int[] arr,int key){
int low = 0;
int high = arr.length - 1;
int mid;
while (low <= high) {
mid = (low + high) / 2;
if (key < arr[mid]) {
high = mid - 1;
}
if (key > arr[mid]) {
low = mid + 1;
}
if (arr[mid] == key) {
return mid;
}
}
return -1;
}