二分查找法
二分查找法也叫折半查找法,它的思想是每次都与序列的中间元素比较。二分查找的前提是数组是有序的。
假设有序数组为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).

浙公网安备 33010602011771号