1. 程式人生 > 實用技巧 >計算機演算法設計與分析<王曉東編著> 2-2二分查詢 演算法分析

計算機演算法設計與分析<王曉東編著> 2-2二分查詢 演算法分析

使用二分查詢法的前提陣列元素有序排列。
查詢思想類似於分治思想。每次都通過跟區間的中間元素對比,將待查詢的區間縮小為之前的一半,直到找到要查詢的元素,或者區間被縮小為 0或 -1 返回-1。
注意到二分查詢針對的必須是已經排序過的有序陣列,否則不能使用該演算法。設查詢的元素為x。
二分查詢的基本思想

  1. 將n個元素分為大致相同的兩個部分[left,mid-1]和[mid+1,right]
    • 如果x==a[mid] 返回中間值索引
    • 如果x < a[mid] right = mid -1 ; 在陣列的左半部分繼續查詢
    • 如果x > a[mid] left = mid + 1; 在陣列的右半部分
      繼續查詢
  • 直到陣列長度不再大於0 或 找到元素x返回索引值。
    如在陣列中查詢元素’10’

    又如在陣列中查詢’19’

程式碼實現(C++)遞迴

template <typename T>
int BinarySearch(T a[], const T& x, int l, int r) {
    if (l <= r) {
	int mid = l + (r - l) / 2;
	if (a[mid] == x) {
	return mid;
	}
	else {
		if (a[mid] < x) {
			return BinarySearch(a, x, mid + 1, r);
		}
		else {
			return BinarySearch(a, x, l, mid - 1);
		}
	}
    }
    else {
	return -1;
    }
}

程式碼實現(C++)非遞迴

template <typename T>
int BinarySearch(T a[], const T& x, int n) {
	int l = 0, r = n - 1;
	while (l <= r) {
		int mid = l + (r - l) / 2;
		if (a[mid] == x)
			return mid;
		if (a[mid] > x)
			r = mid - 1;
		else
			l = mid + 1;
	}
	return -1;
}