class ArrayTest8{
public static void main(String[] args){
int[] arr = {9,12,15,24,36,41,59,68};
int index = binarysearch(arr, 45);
System.out.println(index);
}
/*二分查找法(折半法) 前提:数组必须是有序的
如何去理解折半呢?
相信大家都玩过这个游戏,我在心中想一个数87,每猜一次我只能告诉你
是大了还是小了,你怎么才能最快猜到这个数?
我们就利用折半的方法
1、50 小了
2、75 小了
........ 这样我们就可以最快的找到了这个数字
思路:
1、通过角标查找中间的元素
2、把中间的元素和要找的数值进行比较
3、如果要找的数大了,缩小范围,要找的范围是 中间的位置+1—--尾角标
如果要找的数小了,缩小范围,要找的范围是 头角标---中间的位置-1
4、如此不断的重复,直到找到这个数字为止
*/
public static int binarysearch(int[] arr, int key){
//1.定义三个变量
int min, max, mid;
min = 0;
max = arr.length-1;
mid = (max + min) >> 1;//mid = (max + min)/2;
//2.循环
while (key != arr[mid]){
if (key > arr[mid])
min = mid + 1;
else if (key < arr[mid])
max = mid - 1;
//这里我们要判断要找的元素是否存在
if (max < min)
return -1;
mid = (max + min) >> 1;
}
return mid;
}
// 查找;
/*
需求:查找一个元素在数组中第一次出现的位置
//遍历查找
public static int searchKey(int arr[], int key){
//遍历查找就好了
for (int x=0; x<arr.lenght; x++){
if (key == arr[x])
return x;
}
//我们在数组中查询时,找到返回相对应的角标,没有返回-1
return -1;//表示的是角标不存在
}
*/
}
二分查找法 (折半法)
最新推荐文章于 2022-01-20 15:27:56 发布