java實現二分查詢演算法,兩種方式實現,非遞迴和遞迴
阿新 • • 發佈:2018-11-09
java實現二分查詢演算法
1、概念
- 概念:二分查詢也稱折半查詢(Binary Search),它是一種效率較高的查詢方法。但是,折半查詢要求線性表必須採用順序儲存結構,而且表中元素按關鍵字有序排列。
2、前提
-
必須採用順序儲存結構。
-
必須按關鍵字大小有序排列。
3、思想
- 思想:每次去找中間的那個元素比較大小,每次可以減少一半元素比較。
4、過程
- 定義最小,中間,最大索引:min,mid,max
- 計算中間索引
- 那中間索引和查詢元素索引比較,相等:返回中間索引;小於:左邊查詢 max = mid -1;大於:右邊查詢 min = mid + 1;
- 重新獲取最小索引和最大索引
- 重複前面的步驟,直到找到匹配索引
4、複雜度
總共有n個元素,每次查詢的區間大小就是n,n/2,n/4,…,n/2^k(接下來操作元素的剩餘個數),其中k就是迴圈的次數。
由於n/2^k
取整後>=1,即令n/2^k=1,
可得k=log2n,(是以2為底,n的對數),所以
時間複雜度:可以表示O(n)=O(logn)
5、實現方式
1. 非遞迴方式
package com.fsj;
public class Test10 {
public static void main(String[] args) {
int[] arr = { 11, 22, 33, 44, 55, 66, 77 };
System.out.println(search(arr, 55)); // 4
}
public static int search(int[] arr, int value) {
int min = 0;
int max = arr.length - 1;
while (min <= max) {
int mid = (min + max) / 2;
if (arr[mid] > value) {
max = mid - 1;// 比中間索引的數字大則關鍵字在左區域
} else if (arr[mid] < value) {
min = mid + 1;// 比中間索引的數字小則關鍵字在右區域
} else {
return mid; // 找到直接返回索引
}
}
return -1; // 沒找到,返回-1
}
}
2. 遞迴方式
package com.fsj;
public class Test10 {
public static void main(String[] args) {
int[] arr = { 11, 22, 33, 44, 55, 66, 77 };
System.out.println(search(arr, 44, 0, arr.length - 1)); // 3
}
public static int search(int[] arr, int value, int min, int max) {
int mid = (min + max) / 2;
if (value < arr[min] || value > arr[max] || min > max) {
return -1;
}
if (arr[mid] < value) {
return search(arr, value, mid + 1, max);
} else if (arr[mid] > value) {
return search(arr, value, min, mid - 1);
} else {
return mid;
}
}
}