三种常用的查找算法:顺序查找法、二分法、二叉树

一、顺序查找法

    顺序查找,顾名思义,就是从头到尾遍历的查找,直到找到要找的元素x为止,所以这种方法对于有n个元素的线性表而言,在最坏情况下需要n次比较。

程序:

在个数为n的数组中查找x,输出查找信息。有则返回x的位置。

int search(type arr[],type x,int n){

    int i;

    for(i=0;i<n;i++)

     if(arr[i]==x){

         retuern i;

         break;

     }

     return 0;

}

函数调用结果:若找到,返回位置,若没找到,返回0。


二、二分查找法(折半查找法)
    使用二分查找法的前提是要查找的序列是已经排序好的,所以若序列不是顺序的,应先对其进行排序,或者从小到大,或者从大到小。这种方法的特点是无论怎样查找,每次都只是在一半的数据中查找。

程序(递归):
int search(type arr[],type x,int left, int right){
     int middle;
     while(left<=right){
        middle=(left+right)/2;
        if (x==a[middle])
              return middle;
        else {
              if (x>a[middle])  left=middle+1;
              else   right=middle-1;
              return search(type arr[],type x,int left, int right);
         }
     }
     return 0;
}
函数调用结果:若找到,返回位置,若没找到,返回0。


三、二叉排序树查找
    二叉树是一种很有用的非线性结构。在二叉树中,每一个结点的度最大为2,二叉树中的每个结点的子树被分为左子树和右子树。在二叉树中,一个结点可以只有左子树而没有右子树,也可以只有右子树而没有左子树。当一个结点既没有左子树也没有右子树时,该结点即为叶子结点。
1、特点:
  1)非空二叉树只有一个根结点;
  2)每一个结点最多有两棵子树,且分别称为该结点的左子树和右子树。
2、性质:
  1)在二叉树的第k层上,最多有2k-1(k≥1)个结点;
  2)深度为m的二叉树最多有2m-1个结点;
  3)在任意一棵二叉树中,度为0的结点(即叶子结点)总是比度为2的结点多一个。
  4)具有n个结点的二叉树,其深度至少为〔log2n〕+1,其中〔log2n〕表示取log2n的整数部分。
3、程序:
typedef struct BiTNode//定义二叉树节点结构
{
  int data;  
  struct BiTNode *lchild,*rchild;   //左右孩子指针域
}BiTNode,*BiTree; 
int search(BiTree T,BiTree &p ,int key, BiTree f)
//T是二叉树,p是作为返回被查找元素在二叉树中的位置,key是待查找元素,f是T的双亲,初始值为NULL
{
  BOOL   tmp1,tmp2;
  tmp1=tmp2=False;
  if(!T)   //查找不成功
      {p=f;  return False;}
  else if(key==T->data) //查找成功
      {p=T;  return True;}
  else if(key < T->data)  //在左子树
      tmp1=search(T->lchild,key,T,p);//在左子树中继续查找
  else  //在右子树
      tmp2=search(T->rchild,key,T,p);//在右子树中继续查找
  if(tmp1||tmp2)
      return   True;   //若在子树中查找成功,向上级返回True
  else
      return   False;   //否则返回False
}

    原文作者:查找算法
    原文地址: https://blog.csdn.net/drippingwater/article/details/23743151
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞