二分查找法

二分查找法也叫折半查找法,它的思想是每次都与序列的中间元素比较。二分查找的前提是数组是有序的。

假设有序数组为array[];数组长度为n,要查找的数字为 dataFind。

首先将n个元素分成两半,取 array[n/2] (这里实际上是(0+n-1)/2))与将要查找的值dataFind进行比较,如果findData == array[n/2],则找到findData,算法终止;如果findData < array[n/2],则只要在数组的左半部分继续查找findData;果findData > array[n/2],则只要在数组的右半部分继续查找findData即可。

二分查找可以用递归和非递归的方法来解决。

以下是代码示例:

 1 #include <stdio.h>
 2 
 3 //非递归算法,如果存在返回数组中的位置,不存在返回-1
 4 int BinarySearch(int *array, int len, int findData)
 5 {
 7     if (array == NULL || len <= 0)
 8         return -1;
 9     int low = 0;
10     int high = len - 1;
11     int mid = 0;
12     while (low <= high)
13     {
14         mid = (low + high) / 2;
15         if (findData == array[mid])
16             return mid;
17         else if (findData < array[mid])
18         {
19             high = mid - 1;
20         }
21         else
22         {
23             low = mid + 1;
24         }
25     }
26     return -1;
27 }
28 
29 //递归算法
30 int BinarySearchRecursion(int *array, int findData, int start, int end)
31 {
32     if (start > end)
33         return -1;
34     int mid = (start + end) / 2;
35     if (findData == array[mid])
36         return mid;
37     else if (findData < array[mid])
38         BinarySearchRecursion(array, findData, start, mid - 1);
39     else
40         BinarySearchRecursion(array, findData, mid +1,end);
41 
42 }
43 
44 int BinarySearchRecursion(int *array, int len,int findData)
45 {
46     if (array == NULL || len <= 0)
47         return -1;
48     else
49         BinarySearchRecursion(array, findData, 0, len - 1);
50 }
51 int main()
52 {
53     int array[10] = { 1, 3, 4, 6, 8, 9, 11, 13, 15, 20 };
54     int len = sizeof(array) / sizeof(int);
55 
56     int index = BinarySearch(array, 10, 2);
57     int index2 = BinarySearchRecursion(array,len,2);
58 
59     printf("%d\n%d\n", index, index2);
60     getchar();
61 }

 需要注意的是,二分查找算法的时间复杂度为O(logn),最坏情况下的时间复杂度为O(n*n).

posted @ 2017-03-27 15:41  ren_zhg1992  阅读(585)  评论(0)    收藏  举报