二分查找的陷阱

又到了招聘面试的季节,昨晚手写了个二分查找的代码,敲到电脑里编译,没想到出现“segment fault”这种错误。看来长时间不写算法,手太生了。这里说下遇到的主要问题。

一、 对输入未作安全检查

二、 使用了未初始化的变量

三、 对程序的控制条件控制不够精确。

 

上面的每个错误都足以使代码编程垃圾代码,毫无用处。这些本是比较低级的错误,但是每次写代码的时候,总是不小心会出现。看来想到处理问题的办法和处理问题之间还是有很大的差距的。写这些的时候心里总是想着算法的思路,却往往忽视了代码的完整性和正确性。修改了一下上面的错误,把代码贴上来。

下面的代码当然也不是完全“正确”的,没有考虑数组中找到的元素有重复的情况。

 1 #include <stdio.h>

 2 #include <stdlib.h>

 3 

 4 //non recursion method

 5 int binary_search(int *arr, int len, int key)

 6 {

 7   int low, high, mid;

 8   if(arr == NULL || len <= 0)

 9   {

10     return -1;

11   }

12 

13   // segment fault: use variable without initialization.

14   low = 0;

15   high = len - 1;

16 

17   while(low <= high)

18   {

19     mid = low + (high - low)/2;

20     if(arr[mid] == key)

21     {

22       return mid;

23     }

24     else if(arr[mid] < key)

25     {

26       low = mid + 1;

27     }

28     else

29     {

30       high = mid -1;

31     }

32   }

33   return -1;

34 }

35 

36 static int _bin_search_recur_(int *arr, int low, int high, int key)

37 {

38   int mid;

39   if(low >= high)

40   {

41     return -1;

42   }

43 

44   mid = low + (high - low)/2;

45   

46   if(arr[mid] == key)

47   {

48     return mid;

49   }

50   else if(arr[mid] < key)

51   {

52     return _bin_search_recur_(arr, mid+1, high, key);

53   }

54   else

55   {

56     return _bin_search_recur_(arr, low, mid-1, key);

57   }

58 }

59 

60 //recursion method

61 int binary_search_recur(int *arr, int len, int key)

62 {

63   if(arr == NULL || len <= 0)

64   {

65     return -1;

66   }

67   return _bin_search_recur_(arr, 0, len-1, key);

68 }

 

你可能感兴趣的:(二分查找)