前言

本文章是建立在冒泡排序的基础上写的,如还有对 冒泡排序 不了解的童鞋,可以看看这里哦~ 冒泡排序 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++)的更多相关文章

  1. Java常见排序算法之冒泡排序

    在学习算法的过程中,我们难免会接触很多和排序相关的算法.总而言之,对于任何编程人员来说,基本的排序算法是必须要掌握的. 从今天开始,我们将要进行基本的排序算法的讲解.Are you ready?Let ...

  2. java排序算法之冒泡排序(Bubble Sort)

    java排序算法之冒泡排序(Bubble Sort) 原理:比较两个相邻的元素,将值大的元素交换至右端. 思路:依次比较相邻的两个数,将小数放在前面,大数放在后面.即在第一趟:首先比较第1个和第2个数 ...

  3. [ 转载 ] js十大排序算法:冒泡排序

    js十大排序算法:冒泡排序  http://www.cnblogs.com/beli/p/6297741.html

  4. 排序算法之冒泡排序Java实现

    排序算法之冒泡排序 舞蹈演示排序: 冒泡排序: http://t.cn/hrf58M 希尔排序:http://t.cn/hrosvb  选择排序:http://t.cn/hros6e  插入排序:ht ...

  5. 我的Java开发学习之旅------>Java经典排序算法之冒泡排序

    冒泡排序(Bubble Sort)是一种简单的排序算法.它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来.走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已 ...

  6. java:高速排序算法与冒泡排序算法

     Java:高速排序算法与冒泡算法 首先看下,冒泡排序算法与高速排序算法的效率: 例如以下的是main方法: /**   *  * @Description:  * @author:cuiyaon ...

  7. 排序算法之冒泡排序的思想以及Java实现

    1 基本思想 设排序表长为n,从后向前或者从前向后两两比较相邻元素的值,如果两者的相对次序不对(A[i-1] > A[i]),则交换它们,其结果是将最小的元素交换到待排序序列的第一个位置,我们称 ...

  8. 算法相关——Java排序算法之冒泡排序(二)

    0. 前言 本系列文章将介绍一些常用的排序算法.排序是一个非常常见的应用场景,也是开发岗位面试必问的一道面试题,有人说,如果一个企业招聘开发人员的题目中没有排序算法题,那说明这个企业不是一个" ...

  9. js十大排序算法:冒泡排序

    排序算法说明: (1)对于评述算法优劣术语的说明 稳定:如果a原本在b前面,而a=b,排序之后a仍然在b的前面:不稳定:如果a原本在b的前面,而a=b,排序之后a可能会出现在b的后面: 内排序:所有排 ...

  10. 【DS】排序算法之冒泡排序(Bubble Sort)

    一.算法思想 冒泡排序是排序算法中比较有意思的一种排序方法,也很简单.其算法思想如下: 1)比较相邻的元素.如果第一个比第二个大,就交换他们两个. 2)对每一对相邻元素作同样的工作,从开始第一对到结尾 ...

随机推荐

  1. KingbaseES R3 集群删除test库导致主备无法切换问题

    案例说明: 在KingbaseES R3集群中,kingbasecluster进程会通过test库访问,连接后台数据库服务测试:如果删除test数据库,导致后台数据库服务访问失败,在集群主备切换时,无 ...

  2. LibTorch | 使用神经网络求解一维稳态对流扩散方程

    0. 写在前面 本文将使用基于LibTorch(PyTorch C++接口)的神经网络求解器,对一维稳态对流扩散方程进行求解.研究问题参考自教科书\(^{[1]}\)示例 8.3. 目录 0. 写在前 ...

  3. centos使用Yum安装postgresql 13

    rpm源安装 yum install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-7-x86_64/pgdg-redhat ...

  4. logstash 读取MySQL数据到elasticsearch 相差8小时解决办法

    logstash和elasticsearch是按照UTC时间的,kibana却是按照正常你所在的时区显示的,是因为kibana中可以配置时区信息. 具体看这个: logstash 的配置文件添加 fi ...

  5. 1-Mysql数据库简洁命令

    1-进入mysql数据库 mysql -u root -p 2-创建数据库 mysql> CREATE DATABASE serurities_master; mysql> USE ser ...

  6. ​打造企业自己代码规范IDEA插件(上)

    "交流互鉴是文明发展的本质要求.只有同其他文明交流互鉴.取长补短,才能保持旺盛生命活力." 这说的是文明,但映射到计算机技术本身也是相通的,开源代码/项目就是一种很好的技术交流方式 ...

  7. 线程池底层原理详解与源码分析(补充部分---ScheduledThreadPoolExecutor类分析)

    [1]前言 本篇幅是对 线程池底层原理详解与源码分析  的补充,默认你已经看完了上一篇对ThreadPoolExecutor类有了足够的了解. [2]ScheduledThreadPoolExecut ...

  8. Libgdx游戏开发(2)——接水滴游戏实现

    原文:Libgdx游戏开发(2)--接水滴游戏实现 - Stars-One的杂货小窝 本文使用Kotlin语言开发 通过本文的学习可以初步了解以下基础知识的使用: Basic file access ...

  9. .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法

    一.简述 本文简要的介绍.NET Framework中System.AppDomain.AssemblyResolve事件的用法.使用注意事项,以及复杂场景下AssemblyResolve事件的污染问 ...

  10. EFCore (三)悲观锁 和 乐观锁

    原理 UPDATE [Person] SET [FirstName] = @p1 WHERE [PersonId] = @p0 AND [LastName] = @p2; 在 SaveChanges ...