[排序算法] 双向冒泡排序 (C++)
前言
本文章是建立在冒泡排序的基础上写的,如还有对 冒泡排序 不了解的童鞋,可以看看这里哦~ 冒泡排序 C++
双向冒泡排序原理
双向冒泡排序 的基本思想与 冒泡排序还是一样的。冒泡排序 每次将相邻的两个数进行比较,将较大的放到后面,每一趟比较都将当前最大的数字排到最后面,然后从头再开始进行下一趟比较。(若有 n 个数字,当完成 n - 1 趟比较后,便完成了排序)
双向冒泡排序 只不过进行了一点小小的优化。其是从左右二路并行操作,进行比较和交换。从左路进行比较的过程与冒泡排序一致,从右路进行比较则是将当前最小的数字交换到数组的最左侧。然后 (我自己是将每做一次双向冒泡视为一趟) 每一趟比较都处理掉当前最小数字和最大数字,使其完成归位,下一趟比较只需要处理中间部分就可以啦~。
虽然进行了小小的优化,但是只是稍微提高了排序的效率,只是单纯地进行双向并行比较而已,并没有大幅度缩短排序的时间。
双向冒泡排序动态演示
我们以 [8, 4, 7, 2, 5, 1] 为例进行动态演示

第一趟 向右将当前范围内最大元素放到最右侧

第一趟 向左将当前范围内最小元素放到最左侧

第二趟 向右将中间部分最大放到最右侧

第二趟 向左将中间部分最小放到最左侧

第三趟 向右 发现已经左右部分都已经有序 左右比较都不执行 left与right相等

双向冒泡排序核心代码
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
void TwoBubbleSort(vector<int> &v){
int left = 0, right = v.size() - 1, flag = 1;
//分别从左开始(将最大放到最右) 从右开始(将最小放到最左)
//flag用于记录左右已排序位置
while(left < right){
//向右
for(int i = left; i < right; i++){
if(v[i] > v[i + 1]){
swap(v[i], v[i + 1]);
flag = i;
}
}
right = flag;
//向左
for(int i = right; i > left; i--){
if(v[i] < v[i - 1]){
swap(v[i], v[i - 1]);
flag = i;
}
}
left = flag;
}
//当left==right时,即完成了排序
}
完整程序源代码
#include<iostream>
#include<vector>
#include<ctime>
using namespace std;
void TwoBubbleSort(vector<int> &v){
int left = 0, right = v.size() - 1, flag = 1;
//分别从左开始(将最大放到最右) 从右开始(将最小放到最左)
//flag用于记录左右已排序位置
while(left < right){
//向右
for(int i = left; i < right; i++){
if(v[i] > v[i + 1]){
swap(v[i], v[i + 1]);
flag = i;
}
}
right = flag;
//向左
for(int i = right; i > left; i--){
if(v[i] < v[i - 1]){
swap(v[i], v[i - 1]);
flag = i;
}
}
left = flag;
}
//当left==right时,即完成了排序
}
void show(vector<int> &v){
for(auto &x : v)
cout<<x<<" ";
cout<<endl;
}
main(){
vector<int> v;
srand((int)time(0));
int n = 50; //随机生成50个数字
while(n--)
v.push_back(rand() % 100 + 1); //数字范围[1, 100]
show(v);
TwoBubbleSort(v);
cout<<endl<<endl;
show(v);
}
程序运行结果图

[排序算法] 双向冒泡排序 (C++)的更多相关文章
- Java常见排序算法之冒泡排序
在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...
- java排序算法之冒泡排序(Bubble Sort)
java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...
- [ 转载 ] js十大排序算法:冒泡排序
js十大排序算法:冒泡排序 http://www.cnblogs.com/beli/p/6297741.html
- 排序算法之冒泡排序Java实现
排序算法之冒泡排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb 选择排序:http://t.cn/hros6e 插入排序:ht ...
- 我的Java开发学习之旅------>Java经典排序算法之冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...
- java:高速排序算法与冒泡排序算法
Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /** * * @Description: * @author:cuiyaon ...
- 排序算法之冒泡排序的思想以及Java实现
1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...
- 算法相关——Java排序算法之冒泡排序(二)
0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...
- js十大排序算法:冒泡排序
排序算法说明: (1)对于评述算法优劣术语的说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排 ...
- 【DS】排序算法之冒泡排序(Bubble Sort)
一.算法思想 冒泡排序是排序算法中比较有意思的一种排序方法,也很简单.其算法思想如下: 1)比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2)对每一对相邻元素作同样的工作,从开始第一对到结尾 ...
随机推荐
- 在Windows Server 2019上安装edge浏览器
在Windows 2016和2019的正式版本中是不带Edge浏览器的.有些工具.网站也不支持IE浏览器了.对于偶尔需要在服务器上访问这些站点的管理员来说有些不方便.不过可以通过安装三方浏览器或者Ed ...
- JAVA SE 基础总结
§ 基础知识 一.程序组织与运行原理 1.1 程序组织 一个 JAVA 程序文件中主要由如下几部分构成: package 声明 public 类:public 类与类文件名相同,因为其是作为该类文件唯 ...
- 【学习笔记】Vin-Mono论文阅读笔记(一)
VINS-Mono 概述 VINS-Mono VINS-Mono是由一个单目相机和一个低成本IMU组成的鲁棒通用的单目视觉惯性系统.通过融合预积分的IMU测量值和特征观测值来获得高精度的视觉惯性里程计 ...
- MasaFramework的MinimalAPI设计
在以前的MVC引用程序中,控制器负责接收输入信息.执行.编排操作并返回响应,它是一个功能齐全的框架,它提供了过滤器.内置了模型绑定与验证,并提供了很多可扩展的管道,但它偏重,不像其它语言是通过更加简洁 ...
- Docker 与 Containerd 并用配置
描述: 事实上,Docker 和 Containerd 是可以同时使用的,只不过 Docker 默认使用的 Containerd 的命名空间不是 default,而是 moby,此处为了更方便我们学习 ...
- Node Exporter监控指标
访问http://localhost:9100/metrics,可以看到当前node exporter获取到的当前主机的所有监控数据,如下所示: 每一个监控指标之前都会有一段类似于如下形式的信息: # ...
- Go 源码解读|如何用好 errors 库的 errors.Is() 与 errors.As() 方法
前言 快一个月没有更新技术文章了,这段时间投注了较多的时间学习字节的开源项目 Kitex/Hertz ,并维护一些简单的 issue ,有兴趣的同学也可以去了解: https://www.cloudw ...
- 洛谷P2863 [USACO06JAN]The Cow Prom S (tarjan)
题目简述:一个有向图,求出这个图点数>1的强连通分量的个数. 那么就是tarjan求强联通分量的模板了. 记得要用一个数组标记节点是否在栈中. 1 #include<bits/stdc++ ...
- MybatisPlus生成主键策略方法
MybatisPlus生成主键策略方法 全局id生成策略[因为是全局id所以不推荐] SpringBoot集成Mybatis-Plus 在yaml配置文件中添加MP配置 mybatis-plus: g ...
- 【linux】 第1回 linux运维基础
目录 1. 运维的本质 2. 电脑与服务器 2.1 电脑的种类 2.2 服务器种类 2.3 服务器品牌 2.4 服务器尺寸 2.5 服务器内部组成 3. 磁盘阵列 4. 系统简介 5. 虚拟化 6. ...