遞歸與分治策略
二分搜索
我們所熟知的二分搜索算法是運用分治策略的典型例子,針對這個算法,先給出一個簡單的案例。
目的:給定已排好序的n個元素a[0:n-1],現要在這n個元素中找出一特定的元素x。
我們首先想到的最簡單的是用順序搜索方法,逐個比較a[0:n-1]中元素,直至找出元素x或搜索遍整個數組后確定x不在其中。這個方法沒有很好地利用n個元素已排好序的這個條件,因此在最壞的情況下,順序搜索方法需要O(n)次比較。
而二分搜索方法充分利用了元素間的次序關系,采用分治策略,可在最壞情況下用O(logn)時間完成搜索任務。二分搜索算法的基本思想是,將n個元素分成個數大致相同的兩半,取a[n/2]與x作比較。如果x=a[n/2],則找到x,算法終止;如果x<a[a/2],則只在數組a的左半部繼續搜索x;如果x>a[a/2],則只在數組a的右半部繼續搜索x。具體算法可描述如下:
template<class Type> int BinarySearch(Type a[], const Type& x, int n){ //在a[0]<=a[1]<=...<=a[n-1]中搜索x //找到x時返回其在數組中的位置,否則返回-1 int left = 0; int right = n-1; while (left <= right){ int middle = (left+right)/2; if (x == a[middle]) return middle; if (x > a[middle]) left = middle+1; else right = middle-1; } return-1; //未找到x }