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.数组二分查找法的主要内容,如果未能解决你的问题,请参考以下文章