折半查找算法
在计算机科学中,折半搜索,也称二分查找算法、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。
复杂度分析
时间复杂度折半搜索每次把搜索区域减少一半,时间复杂度为。(n代表集合中元素的个数)空间复杂度 。虽以递归形式定义,但是尾递归,可改写为循环。
C代码如下:
1 #include<stdio.h> 2 #include<string.h> 3 #include<math.h> 4 #include<ctype.h> 5 #include<stdbool.h> 6 7 8 #define COMPARE(x,y) (((x) < (y)) ? -1 : ((x) == (y)) ? 0 : 1) 9 10 /* 11 int COMPARE(int x, int y) 12 { 13 if(x < y) { 14 return -1; 15 } else if(x == y) { 16 return 0; 17 } else { 18 return 1; 19 } 20 } 21 */ 22 23 24 /* 非递归代码 */ 25 int binsearch(int list[], int searchchnumm, int left, int right) 26 { 27 int middle; 28 while(left <= right) { 29 middle = (right + left)/2; 30 switch(COMPARE(list[middle], searchchnumm)) { 31 case -1: 32 left = middle + 1; 33 break; 34 case 0: 35 return middle; 36 break; 37 case 1: 38 right = middle -1; 39 break; 40 default: 41 break; 42 } 43 } 44 return -1; 45 } 46 47 48 49 /* 递归代码 */ 50 int binsearch(int list[], int searchchnumm, int left, int right) 51 { 52 int middle; 53 if(left <= right) { 54 middle = (left + right)/2; 55 switch(COMPARE(list[middle], searchchnumm)) { 56 case -1: 57 return binsearch(list, searchchnumm, middle + 1, right); 58 break; 59 case 0: 60 return middle; 61 break; 62 case 1: 63 return binsearch(list, searchchnumm, left, middle - 1); 64 break; 65 default: 66 break; 67 } 68 } 69 return -1; 70 } 71 72 int main() 73 { 74 int list[] = {2,4,5,1,-3,6,8,10,55,23}; 75 int searchnum = 5; 76 int length; 77 length = sizeof(list) / sizeof(int); 78 printf("%d\n",length); 79 printf("%d\n",binsearch(list,searchnum,0,length)); 80 return 0; 81 }
作者:cpoint
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.