搜索算法实例C源码
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
玩转算法与数据结构之搜索算法
—HIT2000鲁天伟
搜索算法,是在计算机存储的数据中,如何高效的找到所需要的数据。下面我们要给出的就是搜索常用算法实例,供大家学习使用。
搜索算法如下:
线性搜索:整型数组int data[n],要搜索的数据是key。从左起第1个数据开始向右逐个比对,找到则返回位置值,查找游标(数组位置标识变量)越界则表示没有这个数据。线性搜索代码如下:
int linerSearch(int* data,int key,int len){
int index=0;
int counter=0;
for(index=0;index if(data[index]==key) break; } if(index printf("Found it,position in array is %d\n",index); return index; } else printf("Not found\n"); return-1; } 折半搜索:有序(按从小到大顺序排列)整型数组int data[n],要搜索的数据是key。取left游标表示数组左起始位置,取right游标表示数组的右终止位置。取mid=(left+right)/2,如果data[mid]==key返回mid值,如果data[mid]>key, right=mid-1;如果data[mid] 折半搜索代码如下: int zeBan(int*data,int key,int left,int right){ int middle; int position=-1; if(left<=right){ middle=(left+right)/2; if(key==data[middle]){ position=middle; printf("Found it,position in array is %d\n",position); } else{ if(key position=zeBan(data,key,left,middle-1); else position=zeBan(data,key,middle+1,right); } } else{ printf("Not found\n"); } return position; } 斐波那契搜索: 有序(按从小到大顺序排列)整型数组int dataF[n], 要搜索的数据是key。先根据斐波那契数列计算找出K,使FIB(K)-1>=n,K从3开始向上取值(数组中至少要有一个数据)。如果FIB(K)-1==n那么不用拓展数组,如果FIB(K)-1>n则拓展数组dataF 长度,至FIB(K)-1;多出来的位置都用原数组最后一个数据dataF[n-1]来填充。如此得到一个长为FIB(K-1)的新数组data,取游标left表示数组左起位置,取游标right表示数组右止位置。Mid=left+FIB(K-1)-1(即数组中左起第FIB(K-1)个元素,即在FIB(K)-1个元素的数组中,取左起第FIB(K-1)个数据来作为“中位数”), 除去这个Mid位置,新数组被分为两段,左面长度为FIB(K-1)-1, 因为FIB(K)=FIB(K-1)+FIB(K-2),所以右面长度为FIB(K-2)-1(这就是为什么原数组要扩展到FIB(K)-1个数,而不是其它值的原因,看下是不是形成了递归的样子FibSearch(int key,int K,int left,int right,int len)。如果data[Mid]==key,如果Mid 斐波那契搜索代码如下: #include #include #define MAX 28 int dataF[MAX]={1,3,5,7,9,11,13,15,17,19,21,23,25,27,29,31,33,35,37,39,41 ,43,45,47,49,51,53,55}; int*data; int Fib(int N){ if(N<=1) return N; else return Fib(N-1)+Fib(N-2); }