二分搜索技术

二分搜索算法上运用分治策略的典型例子。

给定已排好序的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)。

posted @ 2016-05-10 22:52  cp_cnblogs  阅读(830)  评论(0编辑  收藏  举报