常用查找算法总结
来源:互联网 发布:华海大厦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
- 常用查找算法总结
- 常用查找算法 总结
- 常用查找算法总结
- 常用算法总结之查找(一)------简单查找
- 常用算法总结之查找(二)----折半查找
- 常用算法总结之查找(三)----二叉排序树
- 常用查找算法
- [zt]常用查找算法
- 常用查找算法
- 常用算法- 二分查找
- 常用查找算法
- 常用查找算法
- C++ 常用查找算法
- 常用查找算法
- 常用查找算法
- day02--常用算法--查找
- day02--常用算法--查找
- 常用查找算法
- 迷宫BFS实现
- C++易混知识点 6: 如何通过生命周期使用mutex互斥锁自动加锁和释放
- ICE简单小结
- 黑马程序员-Java集合框架Map
- modelsim添加xilinx的仿真库
- 常用查找算法总结
- Linux Driver
- 程序员面试逻辑测试趣题
- 工作类书籍之计算机相关
- iOS多线程编程之Grand Central Dispatch(GCD)介绍和使用
- Eclipse背景颜色以及字体颜色修改
- 服务的重要性
- Android 第一个OpenGL ES程序
- Jenkins+Ant+Jmeter搭建持续集成的接口测试平台