/*
数组的查找
折半查找:前提是该数组是有序的数组
*/
import java.util.Scanner;
public class arrLookup{
public static void main(String[] args){
int[] arr = {1,4,6,8,34,56,78};
System.out.println("Please enter the number you want to find:");
Scanner in = new Scanner(System.in);
int number = in.nextInt();
//halfSearch
int index = halfSearch(arr, number);
System.out.println("index = "+index);
//halfsearch_2
int index_2 = halfSearch_2(arr, number);
System.out.println("index_2 = "+index_2);
//练习:将元素有序插入数组
Scanner in_1 = new Scanner(System.in);
int number_1 = in_1.nextInt();
int index_3 = getIndex(arr, number_1);
System.out.println("index_3 = "+index_3);
}
//折半查找
public static int halfSearch(int[] arr, int key){
int min = 0;
int max = arr.length-1;
int mid = (min+max)/2;
//判断是否找到key
while(key != arr[mid]){
if(key > arr[mid]) //key大于中间值,把中间值后一个角标赋值给min,max不变
min = mid+1;
else if(key < arr[mid]) //key小于中间值,把中间值前一个角标赋值给max,min不变
max = mid-1;
if(min > max) //如果min>max,说明该数组内没有key
return -1; //该数组没有key
mid = (min+max)/2; //折半
}
return mid;
}
//第二种折半查找
public static int halfSearch_2(int[] arr, int key){
int min = 0;
int max = arr.length-1;
int mid;
//判断min是否小于等于max
while(min <= max){
mid = (min+max)>>1;
if(key > arr[mid])
min = mid+1;
else if(key < arr[mid])
max = mid-1;
else if(key == arr[mid]) //找到key,返回角标
return mid;
}
return -1;
}
//练习:将元素有序插入数组
public static int getIndex(int[] arr, int key){
int min = 0;
int mid;
int max = arr.length-1;
while(min <= max){
mid = (min+max)>>1;
if(key > arr[mid])
min = mid+1;
else if(key < arr[mid])
max = mid-1;
else if(key == arr[mid])
return min;
}
return min;
}
}