Chinaunix首页 | 论坛 | 博客
  • 博客访问: 248832
  • 博文数量: 44
  • 博客积分: 1052
  • 博客等级: 少尉
  • 技术积分: 742
  • 用 户 组: 普通用户
  • 注册时间: 2010-12-17 16:51
文章分类

全部博文(44)

文章存档

2013年(7)

2012年(14)

2011年(23)

分类: C/C++

2012-03-06 19:14:04

看《编程珠玑》,里面介绍了一些二分搜索,在这里记录一下。

本文只包含四种二分搜索实现:普通的,返回第一次出现位置,返回最后一次出现位置,递归的。 书中还有一个对二分搜索进行加速的例子,但这里就不记录了,毕竟二分搜索已经很快了。

二分搜索是一种查找算法,对给定的序列中查找指定的键值。要求序列是排好序了的。这里序列不一定是数字,可以是其他任何你排序后的事物。

牢记:“虽然第一篇二分搜索论文在1946年就发表了,但是第一个没有错误的二分搜索程序却直到1962年才出现”

(1)普通的
  1. int int_bsearch(int a[], int n, int key)
  2. {  /* 在数组a中查找key,a应该已排序 */
  3.     int l, h;
  4.     int mid;

  5.     l = 0;
  6.     h = n - 1;

  7.     while(l <= h)
  8.     {
  9.         mid = (l + h) / 2;
  10.         if(a[mid] > key)
  11.             h = mid - 1;
  12.         else if(a[mid] == key)
  13.             return mid;           /* found match */
  14.         else
  15.             l = mid + 1;
  16.     }
  17.     return -1;                    /* cannot found match */
  18. }
(2)递归的
  1. int recu_bsearch(int a[], int n, int key)
  2. {
  3.     int mid;

  4.     if(n <= 0)
  5.         return -1;
  6.     mid = (n - 1) / 2;
  7.     if(a[mid] == key)
  8.         return mid;
  9.     else if(a[mid] > key)
  10.         return recu_bsearch(a, mid, key);
  11.     else
  12.         return mid + 1 + recu_bsearch(&a[mid+1], n-mid-1, key);
  13. }
(3)返回第一次出现位置的
即返回key在数组a中第一次出现的位置。 看代码后就能知道,该方法要比“普通的”方法要快那么一点,因为减少了一次比较操作
  1. int first_bsearch(int *a, int n, int key)
  2. {
  3.     int low, high;
  4.     int mid;
  5.     int pos;

  6.     /* assume a[low] < key and a[high] >= key */
  7.     low = -1;
  8.     high = n;
  9.     while(low+1 != high)
  10.     {
  11.         mid = (low + high) / 2;
  12.         if(a[mid] < key)
  13.         {
  14.             low = mid;
  15.         }
  16.         else
  17.             high = mid;
  18.     }
  19.     pos = high;                 /* found */
  20.     if(pos == n || a[pos] != key)
  21.         pos = -1;               /* not found match */
  22.     return pos;
  23. }
(4)返回最后一次出现的
即返回key在数组a中最后一次出现的位置。
  1. int lastpos(int *a, int n, int key)
  2. {
  3.     int l, u, m;

  4.     l = -1;
  5.     u = n;

  6.     /* assume x[l] <= t < x[u] */
  7.     while(u - 1 != l)
  8.     {
  9.         m = (l + u) / 2;
  10.         if(a[m] > key)
  11.             u = m;
  12.         else
  13.             l = m;
  14.     }

  15.     if(l == -1 || x[l] != key)
  16.         return -1;
  17.     return l;
  18. }


由于“牢记”里的那句话,所以我有点不敢确定这些代码都是100%正确,若发现问题,还望告知,万分感谢!






阅读(3138) | 评论(0) | 转发(0) |
0

上一篇:求素数

下一篇:apue: 8 process control

给主人留下些什么吧!~~