【数据结构与算法】有序数组二分法查找
来源:互联网 发布:联通软件下载 编辑:程序博客网 时间:2024/05/18 02:07
一、原理
1、初设low为第一个元素,high为最后一元素,mid由每一次循环 (low+high)/2 计算得出
2、若数组元素个数为偶数(此处不妨设为10个) low=0 ,high=9 则mid=4 (其实mid是4还是5,无所谓)
3、最坏的情况找到(即用了最多的次数找到)
元素个数为奇数时,如图所示 low =3 ,mid =4,high=5。
元素个数为偶数时,如找‘20’这个元素,最后 high=mid-1=3 ,则low=mid=high=3 三者重合
4、若没找到:在low=high下一步,必有low>high,此时循环停止,故得出循环判断条件:low<=high
二、C语言实现
#include <stdio.h>#define M 10//数组长度#define FALSE 0//found的没找到标志#define TRUE 1//found成功找到的标志int binary_search(int a[],int n);int main(void){static int a[M]={-12,0,6,16,23,56,80,100,110,115};int n,found;printf("Input a num to be searched:");scanf("%d",&n);//输入要查找的数found = binary_search(a,n);//返回给foundif(found==-1){printf("There is no such a num\n");}else{printf("The num you find is a[%d]",found);}return 0;}int binary_search(int a[],int n){int low,mid,high,found;low=0;high=M-1;//起始low为0即第一个元素,high为最后一个元素found=FALSE;//预设found为失败状态while (low<=high){mid = (low+high)/2;//(注意是整除)if(n==a[mid])//刚好找到{found=TRUE;break;}else if (n>a[mid])//偏大,本来是low代替mid,但是已知n!=a[mid],{//故low=mid+1比low=mid再进一步缩小范围low=mid+1;}else//偏小,同理{high=mid-1;}}//若没找到,则low>high,此时found还是==FALSEswitch (found)//判断标志{case TRUE:return mid;case FALSE:return -1;}}
三、递归二分法
#include <stdio.h>#define M 10//数组长度#define FALSE 0//found的没找到标志#define TRUE 1//found成功找到的标志int BinarySearch(int a[],int n, int left, int right);int main(void){static int a[M]={-12,0,6,16,23,56,80,100,110,115};int n,found;printf("Input a num to be searched:");scanf("%d",&n);//输入要查找的数found = BinarySearch(a,n,0,M-1);//返回给foundif(found==-1){printf("There is no such a num\n");}else{printf("The num you find is a[%d]",found);}printf("\n");return 0;}int BinarySearch(int a[],int n, int left, int right) // n为要找的数,left是数组的首元素下标对应low,right是数组的最后一个元素对应high{int mid;if(left<=right){mid = (left+right)/2;if(a[mid]==n) {return mid; //若a[mid]刚好是找要的数,则返回下标}else if(a[mid]<n){left = mid+1;}else if(a[mid]>n){right = mid-1;}return BinarySearch(a,n,left,right);}return -1;//left<=right不满足,则失败}注意:在else if(a[mid]>n); 处不小心加了分号,在语法上是没有错误的,程序也能执行,但结果是错误的,以后要小心
0 0
- 【数据结构与算法】有序数组二分法查找
- 数据结构-02 数组(有序数组) -二分法查找(折半查找)
- 二分法查找有序数组
- 二分法查找有序数组
- 二分法查找有序数组
- 数据结构与算法之整体有序数组的查找
- java数据结构与算法-有序数组二分查找
- 有序数组和二分法查找
- 二分法查找有序数组元素
- 数据结构回顾版-java数据结构-有序数组和查找算法
- 《数据结构与算法》学习笔记3 有序数组与二分查找
- (二)有序数组的二分法查找
- 二分法在有序数组中进行查找
- 有序数组的二分法查找关键字
- 二分法查找有序数组中的元素
- 【数据结构与算法】折半查找算法(二分法)
- 数据结构与算法 二分法查找【Python与C】的实现
- 数据结构和算法------有序数组和二分查找
- iOS学习笔记
- 对Button上image 和 title 位置进行设置
- MVC,MVP 和 MVVM 的图示
- Cocos2dx C++与Lua合并开发的VS配置环境搭建
- DecimalFormat类的使用
- 【数据结构与算法】有序数组二分法查找
- The Zen of Python
- android studio找不到Subversion
- 平滑效果
- Git入门(10)-添加远程仓库
- PMP vs ACP
- java多线程 sleep()和wait()的区别
- 全排列与next_permutation
- HDU 5741 Helter Skelter(二分)