查詢演算法-二分法
阿新 • • 發佈:2019-01-22
1 原理和步驟
有序陣列插入和刪除操作中,由於所有靠後的資料都需要移動以騰開空間,所以速度較慢。在查詢方面,無序陣列是通過線性查詢,而有序陣列可以通過二分法進行快速查詢,速度比無序陣列快很多。
二分法的時間複雜度為0(log n),具體步驟是先檢視陣列正中間的資料項,如果那個資料項比要找的大,就要縮小範圍,在陣列的前半段進行查詢;反之則在後半段找。反覆這個過程即可。
2完整程式碼
/**
* 二分查詢
*
* @author JayLai
* @version 1.0
* @date 2017年12月29日 12:56
*
*/
public class binarysearch {
private int[] arr; // 初始化陣列
/**
* 建構函式
*/
public binarysearch(int size) {
this.arr = new int[size]; // 初始化陣列
for (int i = 0; i < arr.length; i++) { // 錄入有序陣列
arr[i] = i;
}
}
public int find(int value) {
int firstIndex = 0; // 起始下標
int lastIndex = arr.length - 1; // 末端下標
int middleIndex = (lastIndex + firstIndex) / 2; // 中間項下標
while (value != arr[middleIndex]) {
/*
* firstIndex <= (firstIndex+ lastIndex)/2 < lastIndex
*/
if (middleIndex == lastIndex - 1 ) {
if (value == arr[lastIndex]) {
return lastIndex;
} else {
return -1;
}
} else if (value > arr[middleIndex]) { // 目標資料大於陣列中間項
firstIndex = middleIndex;
middleIndex = (lastIndex + firstIndex) / 2;
} else { // 目標資料小於陣列中間項
lastIndex = middleIndex;
middleIndex = (lastIndex + firstIndex) / 2;
}
}
return middleIndex; // 返回查詢元素的下標
}
public static void main(String[] args) {
binarysearch search = new binarysearch(100);
System.out.println(search.find(99));
System.out.println(search.find(0));
System.out.println(search.find(200));
}
}
3 測試結果
4 參考文獻
[1] Robert, Lafore., Java資料結構和演算法.第2版 版. 2004: 中國電力出版社.
[2] Sedgewick Robert與Wayne Kevin., 演算法. 2012: 人民郵電出版社.