常用查找算法总结

在实际应用中,查找算法无疑是最常用的算法之一了,这里小编给大家总结下常用的查找算法,方便大家理解与使用,写的不好还请包涵。

一、顺序查找

顺序查找的思路比较简单,执行的操作是从数据序列中的第一个元素开始,从头至尾依次逐个查找,直到找到所要的数据或搜索完成整个数据序列。 顺序查找主要针对数据量较少的,无规则的数据。对于一个包含了N个数据的数据序列,理想情况是第一个就是要找的目标,最坏的情况是最后一个,所以平均来说平均比较长度为(N+1)/2,效率较低。
顺序查找的代码如下:
/*顺序查找*/
int SearchFun(int a[],int n,int x)
{
     int i,f = -1;
     for(i = 0; i < n ;i++)
     {
          if(x == a[i])
          {
               f = i;
               break;
          }
     }
     return f;
}
以上方法中 参数a为数据序列数组,参数n为数据量,x为待查找的数据。通过逐个比较来确定数据的索引号,用f保存下来。最后返回数据索引值。

二、折半查找

在实际的应用中,有些数据是 已经排序好了的,这样我们就不用逐个比较来进行查找,可以使用折半查找(二分查找)来提高效率。
使用折半查找时,没有排序的数据可以先进行排序。
折半查找需要三个变量来进行预设值,分别为low,mid,high,分别保存数组的开始、中间和末尾元素的索引号。
如果序号为mid的数据元素与待查找x相等,表示查找到了数据,返回该序号。
如果x<a[mid],则表示x位于low与mid之间,所以保持low不变,high为mid-1(这里假设数据是从小到大排列的),再接着查找mid,并比较a[mid]与x的值。
如果x>a[mid],则表示x位于mid与high之间,所以保持high不变,low为mid+1,再接着查找mid,并比较a[mid]与x的值。
逐步循环,如果low>high,表示未查找到目标。

下面请看代码部分:
/*折半查找*/
int SearchFun(int a[],int n,int x)
{
    int low,high,mid;
    low = 0;
    high = n - 1;
    while(low <= high)
    {
         mid = (low+high)/2;
         if(a[mid] == x)
                  return mid;
         else if(x < a[mid])
                  high = mid - 1;
         else
                  low = mid + 1;
     }
     return -1;
}

三、数据结构中的查找算法之顺序表

顺序表是典型的线性表结构。顺序表查找可以按照序号和关键字查找。

按照序号查找节点
DATA* SLFindByNum(SLType* SL,int n)
{
    if(n<1||n>SL->ListLen+1)
    {
          return NULL;
     }
     return &(SL->ListData[n]);
}

按照关键字查找节点:
int SLFindByKey(SLType* SL,char* key)
{
   int i = 0;
   for(; i < SL->ListLen; i++)
    {
         if(strcmp(SL->ListData[i].key,key) == 0)
              return i;
     }
      return -1;
}

四、数据结构中的查找算法之链表查找

链表结构也是一种顺序结构,只不过采用的是链式存储,这种存储方式相比与顺序存储更加灵活,但是获取数据必须从头结点开始。插入删除操作比较方便。
链表中的查找算法:
CLType* CLFindByNode(CLType* head,char* key)
{
    CLType* htemp;
    htemp = head;
    while(htemp)
    {
       if(strcmp(htemp->nodeData.key,key) == 0)
        {
            return htemp;
        }
        htemp = htemp->Next;
    }
    return NULL;
}

五、数据结构中的查找算法之树结构查找

树结构是一种描述非线性层次关系的数据结构,最重要的是二叉树。二叉树的查找就是遍历二叉树中的每一个结点,逐个比较数据来找到目标所在的结点的指针。
CBTType* TreeFindNode(CBType* treeNode,DATA data)
{
     CBType* ptr;
     if(treeNode == NULL)
     {
          return NULL;
     }
     else
     {
          if(treeNode->data == data)
          {
              return treeNode;
          }
          else
          {
               if(ptr == TreeFindNode(treeNode->left,data))
                         return ptr;
               else if(ptr == TreeFindNode(treeNode->right,data))
                         return ptr;
               else 
                         return NULL;
          }
     }
}

六、数据结构中的查找算法之图查找

图结构也是一种非线性的数据结构,每个数据元素之间可以任意关联。
图结构的查找就是查找图中是否包含某个顶点,通过图的遍历算法来查找。
这里介绍深度优先遍历下的查找
void DeepTraOne(GraphMatrix* GM,int n,char ch)
{
      int i;
      GM->isTrav[n] = 1;//标记该顶点已经被处理
      if(GM GM->Vertex[n] == ch)
      {
            printf("&c",GM->Vertex[n]);
      }
      for(i = 0; i < GM->VertexNum; i++)
      {
            if(GM->EdgeWight[n][i]!=MaxValue && !GM->isTrav[n])
             {
                 DeepTraOne(GM,i);
             }
      }
}

void FindV(GraphMatrix* GM,char ch)
{
    int i;
    for( i = 0;i<GM->VertexNum;i++)
    {
         GM->isTrav[i] = 0;
    }
    for( i = 0; i<GM->VertexNum;i++)
    {
         if(!GM->isTrav[i])
         {
              DeepTraOne(GM,i,ch);
         }
    }
    printf("\n");
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值