关于二分查找算法
来源:互联网 发布:java支付工单状态流程 编辑:程序博客网 时间:2024/05/16 08:11
二分查找算法
一、问题描述;
二分查找法也称为折半查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x<a[n/2],则我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
二、代码;
1、递归实现
//二分查找(递归实现)#include<stdio.h>void ERSearch(int a[], int l, int r, int x);int main(){int i, a[100], x;printf("Please input x:\n");scanf("%d", &x);for(i = 0; i < 100; i++){a[i] = i + 1;}ERSearch(a, 0, 99, x);return 0;}void ERSearch(int a[], int l, int r, int x){int m;//中间元素的下标if(l > r && r > 0){//递归结束条件,数组长度要大于零printf("Not found!\n");}else{m = (r + l) / 2;if (a[m] > x){ERSearch(a, l, m - 1, x);}else{// 小于或者等于的情况if(a[m] < x){ERSearch(a, m + 1, r, x);}else{//等于的情况,即找到了printf("Find it!\n");}}}}2、非递归实现;
<span style="color:#ff0000;">//二分查找(非递归实现)#include<stdio.h>void ERSearch(int a[], int n, int x);int main(){int i, a[100], x;printf("Please input x:\n");scanf("%d", &x);for(i = 0; i < 100; i++){a[i] = i + 1;}ERSearch(a, 99, x);return 0;}void ERSearch(int a[], int n, int x){int i, j, m, flag = 1;//fiag用来说明找到没有if(n > 0){for (i = 0, j = n; j >= i && flag;){//加上flag,找到就退出m = (i + j) / 2;if (a[m] > x){j = m - 1;}else{if (a[m] < x){i = m + 1;}else{printf("Find it!\n");flag = 0;}}}if (flag){printf("Not find!\n");}}}</span>三、心得总结;
在编写时,除了知道它的基本思想之外,还要特别注意的是折半的时候对该数进行加减一操作,否则,容易陷入无休止的计算中。
0 0
- 关于二分查找算法
- 关于二分查找算法
- php关于二分查找的算法
- 查找算法 二分查找
- 查找算法:二分查找
- 算法--查找--二分查找
- 查找算法---二分查找
- 关于二分查找算法(也叫折半查找)
- [算法]二分查找算法
- 算法----二分查找算法
- 查找算法:二分查找算法
- [转载]查找算法----二分查找
- 查找算法之二分查找
- 查找算法之二分查找
- 查找算法_二分查找
- 算法 二分查找(折半查找)
- 查找算法之二分查找
- 查找算法之二分查找
- Hadoop多节点集群安装配置
- Oralce数据库的优化(转)
- 利用API产生PO,已测试成功
- 什么是P问题、NP问题和NPC问题
- Filezilla无法确定拖放操作目标,由于shell未正确安装__解决办法
- 关于二分查找算法
- 清除session内容
- 服务器 libevent源码深度剖析四
- 调试经验--图像
- Ubuntu 1404 Sublime 3 输入中文
- snmp trap编程之分析notification.c
- 服务器 libevent源码深度剖析五
- 使用Ado.net连接Sybase数据库时的字符集问题
- 服务器 libevent源码深度剖析六