[算法][二分法查找]

简介:


 

 

复制代码
 1 /*
 2 二分法实验
 3 1、设a[0:n-1]是一个已排好序的数组.
 4 请改写二分搜索算法,使得当搜索元素x不在数组中时,
 5 返回小于x的最大元素的位置I和大于x的最大元素位置j.
 6 当搜索元素在数组中时,I和j相同,均为x在数组中的位置.
 7 2、设有n个不同的整数排好序后存放于t[0:n-1]中,
 8 若存在一个下标I,0<=i<n,使得t[i]=i,
 9 设计一个有效的算法找到这个下标.
10 要求算法在最坏的情况下的计算时间为O(logn).
11 */
12 #include<iostream>
13 using namespace std;
14 /*
15 功能:1\二分查找改进版
16 输入:拍好序的a[],大小n,待查数x,返回参数i,j
17 返回:真:找到
18 */
19 bool BinarySearch(int *a,int n,int x,int& i,int& j){
20     int left=0;
21     int right=n-1;
22     while(left<=right){
23         int mid=(left+right)/2;
24         if(x==a[mid]){
25             i=j=mid;
26             return true;
27         }
28         if(x>a[mid])
29             left=mid+1;
30         else
31             right=mid-1;
32     }
33     i=right;
34     j=left;
35     return false;
36 }
37 /*
38 功能:2\高效查找
39 输入:数组,大小,待查值
40 返回:下标,若没有返回-1
41 */
42 int SearchTag(int *a,int n,int x){
43     int left=0;
44     int right=n-1;
45     while(left<=right){
46         int mid=(left+right)/2;
47         if(x==a[mid]) return mid;
48         if(x>a[mid])
49             left=mid+1;
50         else
51             right=mid-1;
52     }
53     return -1;
54 }
55 int main(){
56     int n,i,j,a[1000],x;
57     while(cin>>n){//输入数组大小
58         for(i=0;i<n;i++)cin>>a[i];//输入数据,需要从小到大
59         cin>>x;//输入待查数据
60         BinarySearch(a,n,x,i,j);//超找
61         cout<<"用函数1找到的i,j为: "<<'('<<i<<','<<j<<')'<<'\n';//输出对应的i,j
62         cout<<"用函数2找到的下标为: "<<SearchTag(a,n,x)<<"\n\n";//输出2找到的下标
63     }return 0;
64 }
复制代码

 



本文转自beautifulzzzz博客园博客,原文链接:http://www.cnblogs.com/zjutlitao/p/3664896.html,如需转载请自行联系原作者

相关文章
|
NoSQL Java 关系型数据库
【精选】六款JavaWeb项目源码下载
【精选】六款JavaWeb项目源码下载
【精选】六款JavaWeb项目源码下载
|
缓存 JavaScript
运行vue报错npm ERR! A complete log of this run can be found in解决办法
在这里我们需要清除npm的缓存: (1)在cmd命令行窗口中输入:npm cache clean --force (2)然后再运行我们需要安装模块的命令,输入npm install。 有时是网络问题,依赖包加载不完整,删掉node_modules文件后,重新执行npm install即可。
|
6月前
|
领域建模 uml
面向对象分析与设计
一、面向对象分析与设计 面向对象分析与设计(Object-oriented Analysis and Design,简称OOAD)是一种软件开发方法论,旨在通过将现实世界的问题抽象为对象的集合来进行系统分析和设计。 面向对象分析(Object-oriented Analysis,简称OOA)是指通过识别和描述系统中的对象及其相互关系来分析问题。在面向对象分析中,重点关注的是问题域中的实体、属性、行为以及它们之间的关系。通过对问题域的深入理解,可以识别出系统中的关键对象,并确定它们的属性和行为。 面向对象设计(Object-oriented Design,简称OOD)是指根据面向对象分析的结果,
88 0
|
存储 IDE Java
Android程序设计 大作业:基于安卓的校园生活服务系统的设计与实现
Android程序设计 大作业:基于安卓的校园生活服务系统的设计与实现
661 1
Android程序设计 大作业:基于安卓的校园生活服务系统的设计与实现
|
7月前
|
缓存 应用服务中间件 数据库
【JavaWeb】 三大组件之监听器 Listener
在JavaWeb应用程序中,Listener(监听器)是一种机制,用于监听和响应特定的事件。它可以感知并响应与应用程序相关的事件,从而执行相应的逻辑处理。事件是在应用程序运行过程中发生的特定动作或状态改变。例如,Web应用程序的启动和关闭、请求的到达和完成、会话的创建和销毁等都被认为是事件。监听器会注册对这些事件的感兴趣,并在事件发生时调用相应的回调方法来执行预定的业务逻辑。
|
前端开发 Java 应用服务中间件
基于SSM实现公交路线管理系统
基于SSM实现公交路线管理系统
238 0
基于SSM实现公交路线管理系统
IntelliJ IDEA 2022.2 9月最新激活破解教程(永久激活,亲测有效)
IntelliJ IDEA 2022.2 9月最新激活破解教程(永久激活,亲测有效)
4379 0
IntelliJ IDEA 2022.2 9月最新激活破解教程(永久激活,亲测有效)
|
数据库
软件工程——总体设计与详细设计
软件工程——总体设计与详细设计
2583 0
软件工程——总体设计与详细设计
|
存储 安全 测试技术
软件开发中的数据库测试内容与方法
随着网络信息技术的发展, 计算机软件受到广泛关注与重视, 已经形成了良好的开发模式, 可以通过开发研究的方式, 全面提升计算机软件的使用效果, 充分发挥其在计算机中的应用优势。在计算机软件开发期间, 需要使用数据库测试技术, 及时发现其中存在的问题, 采用合理的措施解决问题, 以此提升软件的运行水平。