在实际应用中,查找算法无疑是最常用的算法之一了,这里小编给大家总结下常用的查找算法,方便大家理解与使用,写的不好还请包涵。
一、顺序查找
顺序查找的思路比较简单,执行的操作是从数据序列中的第一个元素开始,从头至尾依次逐个查找,直到找到所要的数据或搜索完成整个数据序列。
顺序查找主要针对数据量较少的,无规则的数据。对于一个包含了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");
}