106.数组二分查找法

Posted 梦想骚年工作室

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了106.数组二分查找法相关的知识,希望对你有一定的参考价值。

之前做过一个猜数字的游戏,让系统随机生成一个1-100之间的数字,猜是多少,如果猜的数比这个数大提示大了,比这个数小提示小了

在猜数字时候我们一般会先猜50,这样如果猜的不对就排出了一半的可能,如果50大了,再猜25,这样如果不对又排除一半的可能,这就是二分查找法,二分查找法,数组二分查找法前提是数组元素时有序的

一个int类型数组arr:{11, 22, 33, 44, 55, 66, 77},查找22对应的索引

数组中最小的值索引是int min = 0,最大值索引是int max = arr.length - 1,值为6,中间元素的索引是int mid = (min + max) / 2,值为3,

mid索引位置的值是44,44>22,22可能在的索引是min到mid - 1,即0到2中,将max的值赋为mid - 1,中间值的索引也就变了(min + max) / 2,值为1,索引1对应的值为22,找到了22对应的索引

如果要查找的是66,中间值44,44<66,将最小索引赋值为中间索引的后一位,索引为4,中间索引就变成5了,索引5对应的值为66,找到了66对应的索引

如果要查找的是88,中间值44,44<88,将最小索引赋值为中间索引的后一位,索引为4,中间索引就变成5了,索引5对应的值为66,66<88,最小索引改为中间索引+1,即6,最大索引也是6,中间索引(6+6)/2=6,索引6对应的值为77,77<88,最小索引改为中间索引+1,即7,这时最小索引已经大于最大索引,说明数组中没有这个值,返回-1即可


代码实现:

写成个方法

要找的是对应值的索引,索引返回值是int类型,参数应该有一个数组和一个对应的值

public static int getIndex(int[] arr, int value) {

int min = 0;//最小值索引

int max = arr.length - 1;//最大值索引

int mid = (min + max) / 2;//中间值索引

while(arr[mid] != value) {//while循环中while后面的是循环条件,只要中间值不等于要找的值就循环

if(arr[mid] < value) {//如果中间值小于指定的值,最小索引变为中间值索引+1

min = mid + 1;

} else if(arr[mid] > value) {//如果中间值大于指定的值,最大索引变为中间值索引-1

max = mid - 1;

}

mid = (min + max) / 2;//最大索引或最小索引已经变化,中间索引也要重新赋值

if(min > max) {最小索引大于最大索引,说明数组中没有这个值,返回-1

return -1;

}

}

return mid;//只要中间值不等于要找的值就循环,这句代码在while循环后面,说明循环已经结束值相等了或一开始arr[mid]就等于value,没走循环

}


以上是关于106.数组二分查找法的主要内容,如果未能解决你的问题,请参考以下文章

二分查找法

算法篇——二分查找法(折半查找法)

二分查找法 2021-05-21

php实现二分查找法

二分查找算法

死磕算法之二分查找法