二分法查詢陣列中元素的位置
阿新 • • 發佈:2018-12-14
基本思想:
假設資料是按升序排序的,對於給定值key,從序列的中間位置mid開始比較,如果當前位置array[mid]值等於value,則查詢成功;若key小於當前位置值array[mid],則在數列的前半段中查詢,array[low,mid-1];若value大於當前位置值array[mid],則在數列的後半段中繼續查詢array[mid+1,high],直到找到為止,時間複雜度:O(log(n))
Java程式碼如下:
package cn.szxy.hq; import java.util.Arrays; /** * @author HQ * @e-mail [email protected]
* @date 2018/10/8. */ public class BinarySearch { public static void main(String[] args) { int array[] = {11, 23, 54, 65, 76, 13, 55, 66, 70, 98, 30, 99, 103}; //將陣列排序 Arrays.sort(array); System.out.println(Arrays.toString(array)); /*查詢元素76的位置(非遞迴演算法)*/ System.out.println(myBinarySearch(array, 76)); System.out.println(Arrays.toString(array)); //查詢元素55的位置 System.out.println(recurBinarySearch(array,55,0,array.length-1)); } /** *二分法查詢元素的位置 非遞迴演算法 * * @param array * @param value * @return */ public static int myBinarySearch(int array[], int value) { int low = 0; int high = array.length - 1; while (low <= high) { int mid = (low + high) / 2; if (array[mid] == value) { return mid; } if (array[mid] > value) { high = mid - 1; } if (array[mid] < value) { low = mid + 1; } } return -1; } /** * 二分法查詢元素的位置 遞迴演算法 * @param array * @param value * @param low * @param high * @return */ public static int recurBinarySearch(int array[], int value, int low, int high) { int mid; mid = (low + high) / 2; if (low > high) { return -1; } if (array[mid] == value) { return mid; } else if (array[mid] > value) { return recurBinarySearch(array, value, low, mid - 1); } else { return recurBinarySearch(array, value, mid + 1, high); } } }