Java 二分查詢 猜數字
阿新 • • 發佈:2020-12-20
Java 二分查詢
二分查詢
需求:猜數字,猜0-20之間的所有數字,包括0 和20,猜對後返回其索引位置,並打印出來索引位置的值,使用鍵盤輸入要猜的數字
方法:使用二分查詢
思路:
- 1、把猜數字的範圍做成陣列(有序的)
- 2、定義陣列中的起始索引位置low和陣列結尾索引位置hight
- 3、每次猜不到都檢查陣列中間的索引位置
- 4、如果猜的數字小了,就修改相應的low值
- 5、如果猜的數字大了,就修改相應的hight值
- 6、猜對了就返回相應的值和數字的位置的索引值
注意:使用二分查詢的時候,陣列必須是有序的!
public static void main(String[ ] args) {
//把猜數字的範圍做成陣列
//宣告一個一維的有序陣列
int[] array = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20};
System.out.println("=================================================");
//需要查詢的元素
Scanner sc=new Scanner(System.in);
System.out.println( "請輸入你要查詢的數字:");
int item = sc.nextInt();
//進行二分查詢,並返回相應的結果
int index = binary_search(array, item);
//根據二分查詢的結果打印出相應的內容
printResult(array, index, item);
//需要查詢的元素
int item1 = -1;
//進行二分查詢,並返回相應的結果
int index1 = binary_search(array, item1) ;
//根據二分查詢的結果打印出相應的內容
printResult(array, index1, item1);
System.out.println("=================================================");
}
/**
* 用二分查詢判斷一個數是否存在一個數組裡
*
* @param array 陣列
* @param item 需要判斷陣列中是否存在的一個指定元素
* @return
*/
public static int binary_search(int[] array, int item) {
//需要查詢的最小範圍 - 陣列索引從0開始
int low = 0;
// 需要查詢的最大範圍 - 陣列長度-1
int high = array.length - 1;
while (low <= high) { // 只要範圍沒有縮小到只包含一個元素,就繼續查詢
// 整數除法,如果(low + high)不是偶數,Java自動將mid向下取整
int mid = (low + high) / 2; //如 (0+3)/2 = 1(1.5向下取整)
int guess = array[mid]; //檢查中間的索引
if (guess== item) { // 如果找到了這個元素,則返回這個元素的索引即位置
return mid;
} else if (guess> item) { // 猜的數字大了
high = mid - 1;
} else {// 猜的數字小了
low = mid + 1;
}
}
return -1; // 返回-1表示沒有指定的元素
}
/**
* 根據二分查詢的結果打印出相應的內容
*
* @param array 用於查詢的陣列
* @param index 二分查詢返回的索引
* @param item 查詢的元素
*/
public static void printResult(int[] array, int index, int item) {
if (index == -1) {
System.out.println("很抱歉,陣列 " + Arrays.toString(array) + " 中沒有 " + item + " 這個元素");
} else {
System.out.println("陣列 " + Arrays.toString(array) + " 中存在 " + item + " 這個元素,它的索引為:" + index);
}
}
查詢正確的結果是:
查詢錯誤的結果是:
注意:使用二分查詢的陣列必須是有序的陣列