BinarySearch,逆序排列的数组的二分查找(折半查找),C++非递归+递归实现
1 // To Compile and Run: g++ binary_search.cc -std=c++11 -Wall -O3 && ./a.out 8
2
3
4 #include <stdlib.h>
5 #include <assert.h>
6
7 #include <iostream>
8 #include <vector>
9
10
11 int BinarySearch(const std::vector<int> &inArr, int target) {
12 int left = 0;
13 int right = inArr.size() - 1;
14
15 while (true) {
16 if (left > right) {
17 std::cout << "Failed to find: " << target << "\n";
18 return -1;
19 }
20
21 int mid = left + (right - left) / 2;
22 if (target == inArr[mid]) {
23 return mid;
24 }
25
26 if (target > inArr[mid]) {
27 right = mid - 1;
28 }
29 // target < inArr[mid]
30 else {
31 left = mid + 1;
32 }
33 }
34
35 std::cerr << "Could never reach here.\n";
36 return -1;
37 }
38
39 int main(int argc, char const *argv[]) {
40 const std::vector<int> arr {
41 8, 7, 4, 3, -5, -9
42 };
43 assert(argc >= 2);
44 int target = atoi(argv[1]);
45
46 int indexOfTarget = BinarySearch(arr, target);
47 if (indexOfTarget < 0) {
48 std::cout << "Failed to find: " << target << "\n";
49 return -1;
50 }
51 std::cout << "Find: " << target << " in " << indexOfTarget << "\n";
52
53 return 0;
54 }
对于顺序排列的数组,只修改26行的符号就行了。
使用递归实现,只需要在BinarySearch函数中去掉while循环,判断结束后,return自身就行了。
代码如下:
1 // To Compile and Run: g++ binary_search.cc -std=c++11 -Wall -O3 && ./a.out 8
2
3
4 #include <stdlib.h>
5 #include <assert.h>
6
7 #include <iostream>
8 #include <vector>
9
10
11 int BinarySearchRecursive(const std::vector<int> &inArr, int target, int left, int right) {
12 if (left > right) {
13 std::cout << "Failed to find: " << target << "\n";
14 return -1;
15 }
16
17 int mid = left + (right - left) / 2;
18 if (target == inArr[mid]) {
19 return mid;
20 }
21
22 if (target > inArr[mid]) {
23 right = mid - 1;
24 }
25 else {
26 left = mid + 1;
27 }
28
29 return BinarySearchRecursive(inArr, target, left, right);
30 }
31
32 int main(int argc, char const *argv[]) {
33 const std::vector<int> arr {
34 8, 7, 4, 3, -5, -9
35 };
36 assert(argc >= 2);
37 int target = atoi(argv[1]);
38
39 int indexOfTarget = BinarySearchRecursive(arr, target, 0, arr.size() - 1);
40 if (indexOfTarget < 0) {
41 std::cout << "Failed to find: " << target << "\n";
42 return -1;
43 }
44 std::cout << "Find: " << target << " in " << indexOfTarget << "\n";
45
46 return 0;
47 }
BinarySearch,逆序排列的数组的二分查找(折半查找),C++非递归+递归实现的更多相关文章
- Java数组逆序排列
//逆序排列原理 /* A: 数组逆序原理* a: 题目分析* 通过观察发现,本题目要实现原数组元素倒序存放操作.即原数组存储元素为{12,69,852,25,89,588},逆序后为原数组存储元素变 ...
- Java实现蓝桥杯VIP算法训练 数组逆序排列
试题 算法训练 数组逆序排列 资源限制 时间限制:1.0s 内存限制:256.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束. ...
- C语言 · 逆序排列
算法提高 逆序排列 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然 ...
- 算法笔记_158:算法提高 逆序排列(Java)
目录 1 问题描述 2 解决方案 1 问题描述 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然后程序将把这个数组中的值按逆序重新存 ...
- 51nod 1020 逆序排列 DP
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...
- SQL-27 给出每个员工每年薪水涨幅超过5000的员工编号emp_no、薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列。 提示:在sqlite中获取datetime时间对应的年份函数为strftime('%Y', to_date)
题目描述 给出每个员工每年薪水涨幅超过5000的员工编号emp_no.薪水变更开始日期from_date以及薪水涨幅值salary_growth,并按照salary_growth逆序排列. 提示:在s ...
- SQL-15 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列
题目描述 查找employees表所有emp_no为奇数,且last_name不为Mary的员工信息,并按照hire_date逆序排列CREATE TABLE `employees` (`emp_no ...
- 51nod 1020 逆序排列 递推DP
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 收藏 关注 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么 ...
- 51nod 1020 逆序排列——dp
在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序.一个排列中逆序的总数就称为这个排列的逆序数. 如2 4 3 1中,2 1,4 3,4 1,3 1是逆序 ...
- 1020 逆序排列(DP)
1020 逆序排列 基准时间限制:2 秒 空间限制:131072 KB 分值: 80 难度:5级算法题 在一个排列中,如果一对数的前后位置与大小顺序相反,即前面的数大于后面的数,那么它们就称为一个逆序 ...
随机推荐
- linux并行执行线程
资料来源: (1) https://www.jianshu.com/p/d8d58846c53f(作者:黄甫一) 1.并行任务较少时: (1) 给需要并行运行的命令行在结尾加上"&& ...
- git常见问题集合
注1:问题总结来自于实际使用,关于搜到的资料链接一并粘贴; 场景1:GIT本地代码处于detached HEAD的情况(又称游离状态)的解决办法; 问题:有时候git由于一些操作的问题出现了detac ...
- 关于服务器选择的chatgpt 的回答
I want to deploy linux as a server with low latency transactions. Which version of the operating sys ...
- 微信小程序-通过绑定事件进行传值
一.数据绑定: <view bindtap="node" data-num="5"> 点击传值:{{nums}} </view> dat ...
- PyTables 教程(一)入门,浏览对象树,将数据提交到表和数组
翻译自http://www.pytables.org/usersguide/tutorials.html 教程 Seràs la clau que obre tots els panys, seràs ...
- jmeter取样器之KafkaProducerSampler(往kafka插入数据)
项目背景 性能测试场景中有一个业务场景的数据抽取策略是直接使用kafka队列,该场景需要准备的测试数据是kafka队列里的数据,故需要实现插入数据到kafka队列,且需要实现控制每分钟插入多少条数据. ...
- p标签设置行数,超出部分用省略号隐藏
p { overflow: hidden; text-overflow: ellipsis; -webkit-line-clamp: 2; word-wrap: break-word; display ...
- PC端 图片宽度是百分比,动态设置图片高度为 6:9
我们知道图片宽度可以设置 百分比,但是高度要给一个固定值 不然不生效,并且产品要求图片显示必须是9:6,这开始确实难倒我了 后面想了一下用js 获取图片宽度 动态的计算高度就行了,超简单 se ...
- [ARC073C] Ball Coloring
简要题意 \(N\) 个盒子,每个盒子里有两个数.现在要把盒子中的数分成两种颜色,满足: 每个盒子中的数分别属于两种颜色,每个数恰好属于一种颜色 两种颜色的数的极差的乘积最小 求这个最小值 \(N \ ...
- Qframework UIKit
用QFramework的UIKit 功能很容易实现UI模块的MVC功能,但MVC模式构造起来还是会有些繁琐, 两个相互直接的UIElement 之间的一些数据传输和调用都要用Msg通过UIPanel ...