折半查找算法

计算机科学中,折半搜索,也称二分查找算法二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于或者小于中间元素,则在数组大于或小于中间元素的那一半中查找,而且跟开始一样从中间元素开始比较。如果在某一步骤数组为空,则代表找不到。这种搜索算法每一次比较都使搜索范围缩小一半。

复杂度分析

时间复杂度折半搜索每次把搜索区域减少一半,时间复杂度为。(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 }

 

你可能感兴趣的:(算法)