二分搜索算法上运用分治策略的典型例子。
给定已排好序的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[n/2],则只要在数组a的左半部继续搜索x。如果x>a[n/2], 则只要在数组a的右半部继续搜索x。
1 #include<stdio.h> 2 3 int binarySearch(int *a, int x, int n) 4 { 5 int left = 0; 6 int right = n - 1; 7 while(left <= right) 8 { 9 int middle = (left + right) / 2; 10 if(x == a[middle]) 11 return middle; 12 if(x > a[middle]) 13 left = middle + 1; 14 else 15 right = middle - 1; 16 } 17 return -1; 18 } 19 20 int main(void) 21 { 22 int a[6] = {1, 2, 3, 4, 5, 6}; 23 int x; 24 25 scanf("%d", &x); 26 if(binarySearch(a, x, 6) != -1) 27 printf("Find"); 28 else 29 printf("No"); 30 31 return 0; 32 }
容易看出,没执行一次算法的while循环, 待搜索数组的大小减少一半。 因此, 在最坏情况下, while循环被执行了O(logn)次。 循环体内运算需要O(1)时间, 因此,整个算法在最坏情况下的计算时间复杂度为O(logn)。