二分查找的非递归实现

来源:互联网 发布:3424网络语 编辑:程序博客网 时间:2024/04/27 15:01

        之前阅读《代码之美》这本书时,作者提到很多程序员都觉得二分查找非常简单,但是却一时半会写不出二分查找算法,或是写得不好。后来听同学说参加面试时被要求手写二分查找,因此决定自己也要复习一下这些基础的算法。平时调用得多了,很多东西还真不见得能很快实现出来…

        二分查找类似于生活中的翻书。比如一本书,页码已经是升序排好的。这个时候你要看第200页,随手一翻,发现是第100页,于是前面100页你就不用翻了,直接翻后面。这一翻,翻到了第300页,于是300页后面的你也不用翻了,继续在100~300页之间搜索第200页。随着翻的次数增多,搜索区间也就被逐步缩小,直到最后找到第200页为止。当然,也存在一种非常不幸的情况,就是有哪个熊孩子把第200页撕了,于是只好返回“404-找不到页面”。当然,计算机的二分查找算法和人类翻书之间还是有区别的。二分查找每次都会翻开待搜索部分的最中间一页,而人类翻书,会翻开第几页就相对随机了很多。

        说完了原理,现在祭出代码。二分查找,时间复杂度O(logn),空间复杂度O(1),非递归实现代码如下:

int BinarySearch(int x[], int n, int key){  int left = 0, right = n-1, mid;  while (left <= right)  {    mid = (left + right) / 2;    if (x[mid] == key)      return mid;               // 找到了,返回目标数的位置    if (x[mid] < key)      left = mid + 1;           // 选择右半段    else      right = mid - 1;          // 选择左半段  }  return -1;                    // 很苦逼,没找到}
0 0