二分查找(有序数组中查找需要的数)
来源:互联网 发布:淘宝店铺装修店招尺寸 编辑:程序博客网 时间:2024/04/30 21:39
1.二分查找介绍
折半查找法也称为二分查找法,它充分利用了元素间的次序关系,采用分治策略,可在最坏的情况下用O(log n)完成搜索任务。它的基本思想是,将n个元素分成个数大致相同的两半,取a[n/2]与欲查找的x作比较,如果x=a[n/2]则找到x,算法终止。如 果x我们只要在数组a的左半部继续搜索x(这里假设数组元素呈升序排列)。如果x>a[n/2],则我们只要在数组a的右 半部继续搜索x。
2. 算法要求
(1)采用顺序结构
(2)数组有序
递归代码:
#include <stdio.h>#include <iostream>using namespace std;/** *@brief递归实现二分查找*@param s 要查找的值*@param first 数组开始的位置*@param last 数组的最高位置*@param sum已经排序好的数组*@return 返回值*@author smallblack*@date 2017.8.29*/int halfSearch(int s,int*sum,int first,int last) { int mid = (first+last) / 2; if (first>last) { return -1; } else { if (sum[mid] == s) return mid; else if (sum[mid]>s) { //递归左边部分 halfSearch(s,sum,first,mid-1); } else if (sum[mid]<s) { //递归右边的部分 halfSearch(s, sum, mid+1,last); } }}//测试代码int main() { int sum[] = {1,2,3,4,5,6,7,8,9,10,11,12}; int s, r; printf("please input a number:\n"); scanf_s("%d",&s); r = halfSearch(s,sum,0,11); if (r == -1) { printf("cannot find..."); } else { printf("数字%d在%d的位置\n",s,r); } getchar(); getchar(); return 0;}
非递归代码:
/** *@brief 非递归实现二分查找*@param s 要查找的值*@param first 数组开始的位置*@param last 数组的最高位置*@param a已经排序好的数组*@return 返回值*@author smallblack*@date 2017.8.29*/int binSort(int s,int* a,int first,int last) { while (first<last) { int mid = (first+last) / 2; if (a[mid] == s) { return mid; } else if (a[mid]>s) { last = mid - 1; } else { first = mid + 1; } }}
阅读全文
0 0
- 二分查找(有序数组中查找需要的数)
- 有序数组的二分查找
- 有序数组的二分查找
- 有序数组的二分查找
- 有序数组\二分查找
- 有序数组二分查找
- 二分查找有序数组中某个数的所在范围 Search for a Range
- 从有序数组中查找某个值(二分)
- 有序 循环数组的二分查找
- 旋转有序数组的二分查找
- 有序数组的二分查找程序
- 9.5-字符串有序数组的二分查找
- 对于有序数组的二分查找算法
- 旋转有序数组的二分查找
- 基于有序数组的二分查找
- 旋转有序数组的二分查找
- 二分查找思想寻找有序数组中查找最小值
- 查找一维有序浮点数组中相近的数
- PAT (Basic Level) Practise (中文) 1005继续(3n+1)猜想 (25)
- Python descriptor 描述器
- n个正整数,联接成一排,组成一个最大(最小)的多位整数 python
- 创建svn版本库
- Java抽象类tips
- 二分查找(有序数组中查找需要的数)
- Andriod的七大生命周期
- git远程分支相关
- lintcode刷题——x的n次幂
- POJ1236
- [NOIP模拟](三)T1-太空电梯
- Python的循环语句
- 微信 全跳转二级菜单(无点击事件)
- Android Toast