Chinaunix首页 | 论坛 | 博客
  • 博客访问: 14998
  • 博文数量: 11
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 65
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-06 22:02
文章分类

全部博文(11)

文章存档

2014年(11)

我的朋友
最近访客

分类: C/C++

2014-04-13 08:49:44

一、顺序查找的基本思想:

从表的一端开始,顺序扫描表,依次将扫描到的结点关键字和给定值(假定为a)相比较,若当前结点关键字与a相等,则查找成功;若扫描结束后,仍未找到关键字等于a的结点,则查找失败。

 

说白了就是,从头到尾,一个一个地比,找着相同的就成功,找不到就失败。很明显的缺点就是查找效率低。

 

适用于线性表的顺序存储结构和链式存储结构。




计算平均查找长度。

例如上表,查找1,需要1次,查找2需要2次,依次往下推,可知查找16需要16次,

可以看出,我们只要将这些查找次数求和(我们初中学的,上底加下底乘以高除以2),然后除以结点数,即为平均查找长度。

n=节点数

平均查找长度=n+1/2

 

二、二分法查找(折半查找)的基本思想:


前提:

1)确定该区间的中点位置:mid=low+high/2    

min代表区间中间的结点的位置,low代表区间最左结点位置,high代表区间最右结点位置

2)将待查a值与结点mid的关键字(下面用R[mid].key)比较,若相等,则查找成功,否则确定新的查找区间:

如果R[mid].key>a,则由表的有序性可知,R[mid].key右侧的值都大于a,所以等于a的关键字如果存在,必然在R[mid].key左边的表中。这时high=mid-1

如果R[mid].key则等于a的关键字如果存在,必然在R[mid].key右边的表中。这时low=mid

如果R[mid].key=a,则查找成功。

3)下一次查找针对新的查找区间,重复步骤(1)和(2

4)在查找过程中,low逐步增加,high逐步减少,如果high,则查找失败。




平均查找长度=Log2(n+1)-1

 

注:虽然二分法查找的效率高,但是要将表按关键字排序。而排序本身是一种很费时的运算,所以二分法比较适用于顺序存储结构。为保持表的有序性,在顺序结构中插入和删除都必须移动大量的结点。因此,二分查找特别适用于那种一经建立就很少改动而又经常需要查找的线性表。

点击(此处)折叠或打开

  1. #include <stdio.h>
  2. int binSearch(int, int, int);
  3. main()
  4. {
  5.    int i, n = 10, x = 7;
  6.    //这里如果把数组a[]定义为a[n],是错误的,不能定义变长数组。
  7.    int a[10];
  8.    printf("Please enter your num:/n");
  9.    //从标准输入给数组赋值的唯一方法:用for循环
  10.    for(i=0;i<n;i++)
  11.    {
  12.       scanf("%d",&a[i]);
  13.    }
  14.    printf("The %d can be found in the arr, it is %dth of the arr/n",
  15.            x, binSearch(x,a,n));
  16. }
  17. /*第一种方法,判断都在循环内*/
  18. int binSearch(int x, int a[], int n)
  19. {
  20.    int low, high, mid;
  21.    low = 0;
  22.    high = n-1;
  23.    //注意,这里必须用<=,<不对,一直返回-1
  24.    while(low <= high)
  25.    {
  26.       mid = (low + high) / 2;
  27.       if(x < a[mid])
  28.      high = mid - 1;
  29.      else if(x > a[mid])
  30.      low = mid + 1;
  31.      else
  32.      return mid;
  33.    }
  34.    return -1;
  35. }
  36. /*在循环内执行一次测试的方法*/
  37. /*int binSearch(int x, int a[], int n)
  38. {
  39.    int low, high, mid;
  40.    low = 0;
  41.    high = n-1;
  42.    mid = (low + high) / 2;
  43.    while((low <= high)&&(a[mid]!=x))
  44.    {
  45.       if(x < a[mid])
  46.      high = mid -1;
  47.      else
  48.      low = mid + 1;
  49.      mid = (low + high) / 2;
  50.    }
  51.    if(a[mid] == x)
  52.    return mid;
  53.    else
  54.    return -1;
  55. }
  56. */

Please enter your num:
1
2
3
4
5
6
7
8
9
10
The 7 can be found in the arr, it is 6 th of the arr





参考资料:
http://blog.csdn.net/shan9liang/article/details/7533466
http://blog.csdn.net/zevin/article/details/6565811


阅读(323) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~