顺序搜索和二分搜索

前言::没有对比就没有差距,看了时间的复杂度才第一次真正感受到二分的速度。 睡觉
奋斗顺序查找(sequential search)又称线性查找 ,从顺序表的一端开始,依次将每个元素的关键字同给定值K进行比较,若某个元素的关键字等于K,则表明查找成功,返回该元素下标,若所有元素都比较完毕仍找不到,则表明查找失败,返回特定值,常用-1.

  优点:最简单,对元素排列次序无要求,插入新元素方便。

  缺点:速度慢,平均查找长度为(n+1)/2,约为表长度一半。

  提高效率的方法:按查找概率从大到小排列。事先未知概率的情况下,每次查找到一个元素时,将它与前驱元素对调位置,这样,查找频度高的元素就会逐渐前移。

   代码::  

int search (int a[],int v,int begin,int end)
{
    int i;
    for(i = 1;i<=end;i++)
        if(v==a[i]) return i;  //如果相等,返回下标。
    return -1;  //否则返回-1.
}

奋斗二分查找(binary search)又称折半查找,对分查找。作为二分查找对象的数据表必须是顺序存储的有序表。

  二分查找的过程:有序表A[0]~A[n-1],首先取中点元素A[mid]的关键字同给定值K进行比较,若相等则查找成功;否则,若K< A[mid].key,则在左子表中继续进行二分查找;若K> A[mid].key,则在右子表中继续进行二分查找;这样,经过一次比较,就缩小一半查找空间,如此进行下去,直到查找成功,或者当前查找区间为空时为止(或区间的下界大于等于上界时为止)。

  二分查找的过程是递归的,也很容易写成非递归算法,只需要根据情况修改待查找区域的上下界即可。

  二分查找过程可用一棵二叉树来描述,树中的每个根结点对应当前查找区间的中点元素,它的左子树和右子树分别对应该区间的左子表和右子表,通常把此树称为二分查找的判定树。由于二分查找在有序表上进行,所以其对应的判定树是一棵二叉搜索树(排序树)。

  在有序表上二分查找一个关键字等于K的元素时,对应着判定树中从根结点到待查结点的一条路径,同关键字进行比较的次数就等于该路径上的结点数,或者说等于待查结点的层数。

  优点:时间复杂度为O(logn),查找速度快。

  缺点:需要建立有序表,并且插入和删除会比较麻烦。另外,只适用于顺序存储的有序表,不适用于链接存储的有序表。


代码::

int search (int a[],int v,int begin,int end)
{
  while(end>=begin)
  {
      int m = (begin+end)/2;//中间值
      if(v== a[m]) return m;
      if(v<a[m]) end=m-1; //小于中间值,向左区间查找。
      else begin=m+1;//否则右区间查找。
  }
  return -1;
}

                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     



  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值