1. 程式人生 > >java實現二分查詢演算法,兩種方式實現,非遞迴和遞迴

java實現二分查詢演算法,兩種方式實現,非遞迴和遞迴

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;
		}
	}
}