JAVA非遞迴二分查詢
阿新 • • 發佈:2021-01-07
JAVA程式設計師常用的十大演算法之一"二分查詢"(非遞迴方式)
二分查詢是我們程式設計師常用的一種查詢方式,實現二分查詢也非常簡單,方式也有多種,遞迴方式,非遞迴方式;這裡描述一種非遞迴方式的二分查詢演算法。二分查詢的前提是待查詢的數列必須是一組有序的(升序降序都可以),這裡以升序為例,程式碼很簡單,如下:
/**
* 二分查詢的非遞迴實現
* @param arr 待查詢的陣列(arr必須是有序的,升序)
* @param target 需要查詢的數
* @return 返回對應的下標,-1表示沒找到
*/
public static int binarySearch(int[] arr,int target){
int left = 0;//左
int right = arr.length - 1;//右
while (left <= right){//說明還有,繼續查詢
int mid = (left + right) / 2;
if(arr[mid] == target){
return mid;
}else if (arr[mid] > target){//如果陣列為降序排列,則這裡的條件為:arr[mid] < target
right = mid - 1;//需要向左查詢
}else {
left = mid + 1;//需要向右查詢
}
}
return -1;
}
對上面程式碼進行說明:arr是一組有序的陣列(這裡以升序為例),target是待查詢的元素,首先定義兩個整型資料left,right;left表示左邊的下標(初始為0),right表示右邊的下標(初始為陣列的長度-1)。然後while迴圈進行查詢,如果左邊下標小於或者等於右邊下標,說明陣列元素還沒有找完,繼續查詢;進入迴圈後進行二分,然後判斷二分處的值與待查詢的值之間的關係,如果相等則說明找到了,直接返回該下標;如果大於待查詢的值,因為這裡陣列是升序排列,說明待查詢的值在二分處的值的左邊,把右邊的下標賦給二分處前一個下標,使其向左邊繼續查詢;如果二分處的值小於待查詢的值,說明待查詢的值在二分處的值的右邊,把左邊的下標賦給二分處後一個下標,使其向右邊繼續查詢。如果陣列為降序排列,左右下標的查詢條件則相反。當迴圈完畢後仍未找到,說明沒有該值,返回-1。
public class BinarySearchNoRecur {
public static void main(String[] args) {
//測試
int[] arr = {1,3, 5, 7, 9, 11, 13};
// int[] arr = {13,11, 9, 7, 5, 3, 1};
int index = binarySearch(arr, 13);
System.out.println("index=" + index);
}
/**
* 二分查詢的非遞迴實現
* @param arr 待查詢的陣列(arr必須是有序的,升序)
* @param target 需要查詢的數
* @return 返回對應的下標,-1表示沒找到
*/
public static int binarySearch(int[] arr,int target){
int left = 0;//左
int right = arr.length - 1;//右
while (left <= right){//說明還有,繼續查詢
int mid = (left + right) / 2;
if(arr[mid] == target){
return mid;
}else if (arr[mid] > target){//如果陣列為降序排列,則這裡的條件為:arr[mid] < target
right = mid - 1;//需要向左查詢
}else {
left = mid + 1;//需要向右查詢
}
}
return -1;
}
}
這裡我們在{1,3, 5, 7, 9, 11, 13}這組升序陣列中查詢"13"這個元素,返回下標為6。
說明一點:如果待查詢的元素不止一個,我們可以使用列表新增的方式進行儲存其下標來實現查詢所有的待查詢元素的下標。