你能正确实现二分检索吗

   前两天和一位学哥闲聊的时候,他对我提到了有关面试的一些细节。他说面试的时候,有一个扎实的编程基础还是很重要的。比如基本的排序算法(冒泡排序,插入排序,归并排序,基数排序等),查找算法(顺序查找,二分查找,分块查找,哈希表查找),这些一定要在纸上能写出代码。于是便拿起那本尘封已久的《编程珠玑》,随便翻了一页就翻到了二分检索这部分。

   二分检索可以解决问题:只要数组中包含T(即要查找的数),那么通过不断缩小包含T的范围 ,最终就可以找到它。一开始,范围覆盖整个数组。讲述组的中间项羽T进行比较,可以排除一半元素,范围缩小一半。就这样反复比较,反复缩小范围,最终就会在数组中找到T,或者确定原以为T所在的范围实际为空。对于包含N个元素的集合,整个查找过程大约要经过log(2)N次比较。


   或许大家都以为只要理解了二分检索的算法描述,就离顺利写出代码不远了。但是事实却并非如此,你要是不相信,可以自己动手敲一下。我是自己亲手实践了一把,果然出了bug。经过调试,算是正确了。大家不妨也试试,看看自己的表现怎样。

以下贴出本人自己写的二分检索算法(已修改过)

while(true)  {      if(a[middle] < x)      {          low = middle+1;          middle = (low+high) / 2;      }      if(a[middle] > x)      {          high = middle-1;          middle = (low+high) / 2;      }      if(a[middle] == x)      {         printf("Find it");         return x;      }      if(a[high] < x || a[low] > x)      {          printf("This number is not in the range");          break;      }  }

      各位应该已经熟知该算法了,就当是温习吧。本人以后的文章将会逐渐贴出各种排序和查找的相关算法和大家交流和讨论。

你可能感兴趣的:(编程,算法,面试)