关于折半查找算法
2016-03-01 12:28
253 查看
二月底的末唤来了阳春三月的暖,天清气朗,惠风和煦,有时候真想拿着以前放的风筝,冲出去体验一把田野奔跑的欢乐。但也只是想想而已,越来越宅的我始终也离不开手中的笔记本电脑了。
也不知道是气温上升的缘故还是春困突然上头的缘故,看了几天的折半查找算法才算是把它搞懂。
折半查找算法是一种比顺序查找更高效简洁的算法,其查找长度至多为㏒2n+1(判定树的深度),平均查找长度为㏒2(n+1)-1,但是它有一个很大的缺点,是必须要求查找的序列是顺序存储有序表。
每种算法都可以用迭代和递归来表示,以下我将用C/C++来分别表示。
C/C++ 迭代形式:
在if程序处,我为什么要加上一个莫名其妙的注释——if…else …error。因为之前我想用这个结构来实现,但后来发现我犯了一个低级的错误,我们的目的是要在子程序中不停循环变换上下限,进行分而治之的算法,而if …else …只是判断执行一遍,当然与我们的要求不一样。
C/C++ 递归形式:
伟大的递归算法,只是我们把发生改变的数据又顺手抛给了程序自己处理,虽然给消耗内存栈的空间,但是算法相对简单。
也不知道是气温上升的缘故还是春困突然上头的缘故,看了几天的折半查找算法才算是把它搞懂。
折半查找算法是一种比顺序查找更高效简洁的算法,其查找长度至多为㏒2n+1(判定树的深度),平均查找长度为㏒2(n+1)-1,但是它有一个很大的缺点,是必须要求查找的序列是顺序存储有序表。
每种算法都可以用迭代和递归来表示,以下我将用C/C++来分别表示。
C/C++ 迭代形式:
#include<stdio.h> int find(int a[],int x,int low,int high) { int mid; if(low>high) //if .... else .... error!!! return -1; while(low<=high) { mid=(low+high)/2; if(a[mid]==x) return mid; else if(a[mid]>x) high = mid-1; else if(a[mid]<x) low = mid + 1; } } int main() { int a[20]={2,3,6,7,12,18,19,21,25,28,30,33,37,39,42,45,47,49,50,51}; int x,i; printf("已有的数是:\n"); for(i=0;i<20;i++) printf("%d ",a[i]); printf("\n请输入要查找的数:"); scanf("%d",&x); if((i=find(a,x,0,19))>=0) printf("%d是第%d个数\n",x,i+1); else printf("未找到%d\n",x); return 0; }
在if程序处,我为什么要加上一个莫名其妙的注释——if…else …error。因为之前我想用这个结构来实现,但后来发现我犯了一个低级的错误,我们的目的是要在子程序中不停循环变换上下限,进行分而治之的算法,而if …else …只是判断执行一遍,当然与我们的要求不一样。
C/C++ 递归形式:
#include<stdio.h> int find(int a[],int x,int low,int high) {int mid; if(low>high) return -1; mid=(low+high)/2; return mid; if(a[mid]>x) return find(a,x,low,mid-1); return find(a,x,mid+1,high); } int main() { int a[20]={2,3,6,7,12,18,19,21,25,28,30,33,37,39,42,45,47,49,50,51}; int x,i; printf("已有的数是:\n"); for(i=0;i<20;i++) printf("%d ",a[i]); printf("\n请输入要查找的数:"); scanf("%d",&x); if((i=find(a,x,0,19))>=0) printf("%d是第%d个数\n",x,i+1); else printf("未找到%d\n",x); return 0; }
伟大的递归算法,只是我们把发生改变的数据又顺手抛给了程序自己处理,虽然给消耗内存栈的空间,但是算法相对简单。
相关文章推荐
- 书评:《算法之美( Algorithms to Live By )》
- 动易2006序列号破解算法公布
- Ruby实现的矩阵连乘算法
- C#插入法排序算法实例分析
- 超大数据量存储常用数据库分表分库算法总结
- C#数据结构与算法揭秘二
- C#冒泡法排序算法实例分析
- 算法练习之从String.indexOf的模拟实现开始
- C#算法之关于大牛生小牛的问题
- C#实现的算24点游戏算法实例分析
- c语言实现的带通配符匹配算法
- 浅析STL中的常用算法
- 算法之排列算法与组合算法详解
- C++实现一维向量旋转算法
- Ruby实现的合并排序算法
- C#折半插入排序算法实现方法
- 基于C++实现的各种内部排序算法汇总
- C++线性时间的排序算法分析
- C++实现汉诺塔算法经典实例
- PHP实现克鲁斯卡尔算法实例解析