前言

本文章是建立在冒泡排序的基础上写的,如还有对 冒泡排序 不了解的童鞋,可以看看这里哦~ 冒泡排序 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. Spring配置XML本地提示

    Spring配置XML本地提示:点击eclipse属性-->选择XML Catalog 这里有一点要注意:要选择schema location

  2. flutter系列之:flutter中常用的ListView layout详解

    目录 简介 ListView详解 ListView中的特有属性 ListView的构造函数 ListView的使用 总结 简介 ListView是包含多个child组件的widget,在ListVie ...

  3. 2、String类

    String类 String 对象用于保存字符串,也就是一组字符序列 字符串常量对象是用双引号括起来的字符序列,例如:"你好"."12.07"."bo ...

  4. 使用elasticdump迁移es数据

    安装elasticdump github地址:https://github.com/elasticsearch-dump/elasticsearch-dump # yum -y install npm ...

  5. 论文解读(FedGAT)《Federated Graph Attention Network for Rumor Detection》

    论文信息 论文标题:Federated Graph Attention Network for Rumor Detection论文作者:Huidong Wang, Chuanzheng Bai, Ji ...

  6. 高可用(vrrp)以及mysql主主备份部署

    高可用说起来感觉很高大上,我刚接触的时候也是一头雾水,但是需求的时候很容易理解的,当一台服务器挂了另一台能够马上顶上去继续提供服务,这就叫做高可用,需求其实不难理解,只是需要自身根据项目的实际需求还有 ...

  7. netstat -lnp |grep XXX后不显示进程

    netstat -lnp |grep XXX后不显示进程,不一定是没有进程,可能是这个命令不好使,换成 ps -ef | grep XXX

  8. Node.js(七)MySql+ajax

    Api.js const express=require("express"); const router=express.Router(); const mysql = requ ...

  9. proxy解决跨域问题

    首先我们在本地开发,域名都是localhost,当我们需要请求后台数据时,就会出现跨域的问题 下面就是在vue.config.js配置文件里: devServer: {     proxy: {    ...

  10. Java19虚拟线程都来了,我正在写的线程代码会被淘汰掉吗?

    Java19中引入了虚拟线程,虽然默认是关闭的,但是可以以Preview模式启用,这绝对是一个重大的更新,今天Java架构杂谈带大家开箱验货,看看这家伙实现了什么了不起的功能. 1 为什么需要虚拟线程 ...