常用查找算法总结

来源:互联网 发布:华海大厦3楼桑拿js 编辑:程序博客网 时间:2024/04/30 08:20

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

一、顺序查找

顺序查找的思路比较简单,执行的操作是从数据序列中的第一个元素开始,从头至尾依次逐个查找,直到找到所要的数据或搜索完成整个数据序列。顺序查找主要针对数据量较少的,无规则的数据。对于一个包含了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");}




0 0
原创粉丝点击