目录
一、二分查找法
(一)二分查找法是一种常见的查找法。
(二)使用二分查找法的前提条件是数组元素必须已经排序。
(三)不失一般性,假设数组按升序排序。
(四)二分查找法首先将关键字与数组的中间元素比较,有下面3种情况:
· 如果关键字比中间元素小,那么只需在前一半数组元素中查找。
· 如果关键字和中间元素相等,则查找成功,查找结束。
· 如果关键字比中间元素大,那么只需在后一半数组元素中查找。
(五)显然,二分法查找每比较一次就排除数组中一半的元素。
二、假设
假设用low和high分别记录当前查找的数组的第一个和最后一个下标。初始条件下,low为0,high为array.length-1。mid表示数组中间元素的下标,这样mid就是(low+high) / 2。
首先,关键字key与中间元素array[mid]比较,如果小于中间元素,将high设为mid-1;如果等于中间元素,则匹配成功,返回mid;如果大于中间元组,将low设为mid + 1。继续这样的查找,直到low > high或查找成功。如果low > high,则返回-low -1,low就是插入点。
三、代码及结果
(一)代码
package csdn.every.day;
public class Day35ErFen {
public static void main(String[] args) {
int[] a = {75, 55, 30, 10, 50, 199, 13, 54};
int key = 55;
PaiXu(a);//冒泡排序(升序)
System.out.println("\n" + "关键字的位置(数组的下标):" + binarySearch(a, key));
}
public static int[] PaiXu(int[] a) {
for (var i = 0; i < a.length - 1; i++) { //找到最大,最后出场的都是大佬嘛
for (var j = 0; j < a.length - i - 1; j++) {
if (a[j] > a[j + 1]) { //若想要降序,修改为 < 即可。
int t = a[j];
a[j] = a[j + 1];
a[j + 1] = t;
}
}
}
for (var n2 : a) {
System.out.print(" " + n2);
}
return a;
}
public static int binarySearch(int[] array, int key){
int low = 0;
int high = array.length-1;
while(high >=low){
int mid = (low+high)/2;
if(key< array[mid])
high = mid -1;
else if(key == array[mid])
return mid;
else
low = mid +1;
}
return -low-1;
}
}