1. 程式人生 > >查詢演算法-二分法

查詢演算法-二分法

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: 人民郵電出版社.