C++017-C++冒泡排序与插入排序
文章目录
- C++017-C++冒泡排序与插入排序
- 冒泡排序与插入排序
- 目标
- 冒泡排序
- 排序规则
- 冒泡排序优化
- 插入排序
- 题目描述
- 在线练习:
- 总结
C++017-C++冒泡排序与插入排序

在线练习:
http://noi.openjudge.cn/
https://www.luogu.com.cn/
冒泡排序与插入排序
参考:
目标
1.理解并掌握冒泡排序基本原理
2.理解并掌握插入排序基本原理
3.掌握冒泡排序与插入排序的基本使用
冒泡排序
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有元素再需要交换,也就是说该数列已经排序完成。
这个算法的名字由来是因为越小的元素会经由交换像气泡一样慢慢“浮”到数列的顶端。
排序规则
每次比较相邻的元素,如果第一个比第二个大,就交换他们两个。对每—对相邻元素做同样的工作,从开始第一对到结尾的最后一对。经过一轮排序后,最后的元素应该会是最大的数。
针对所有的元素重复以上的步骤,除了最后一个。
持续每轮对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较,也就是已经是按照从小到大的顺序排列了。

每轮比较都会确定一个数字的位置,因此N个数字需要比较N-1轮。如如果是5个数比较,则
第一轮比较了4次,
第二轮比较3次,
第三轮比较2次,
第四轮比较1次,
那么第i轮比较的次数为N-i次。
每次比较均是对相邻两个数字作比较,直至最后。
#include <iostream>using namespace std;int main()
{int n;int a[6]={0,3,4,1,5,2};n=sizeof(a)/sizeof(int);cout<<n<<endl;int outres=0;for(int i=1;i<=n;i++){outres++;int innerres=0;for(int j=1;j<=n-i;j++){innerres++;if(a[j]>a[j+1]){swap(a[j],a[j+1]);}cout<<"执行的外循环次数-->"<<outres<<"执行的内循环次数-->"<<innerres<<endl;}}for(int i=1;i<=5;i++){cout<<a[i]<<" ";}return 0;
}

冒泡排序优化
参考:冒泡排序的三种优化
刚才对于序列{12,35,99,18,76}的排序过程中,我们不难发现,第二轮排序进行完之后,整个序列已经是有序的了,也就是说第二轮排序结束就可以不用接着进行接下来的比较了。
因此我们可以对刚才的程序进行优化,那么什么时候就可以结束排序过程呢?根据观察,我们发现当某轮排序过程中没有交换的发生,那么就说明序列已经有序,无需再次比较了。
#include <iostream>using namespace std;int main()
{int n;int a[6]={0,3,4,1,5,2};n=sizeof(a)/sizeof(int);cout<<n<<endl;int outres=0;for(int i=1;i<=n;i++){bool flag=0;// 优化 标记是否有交换outres++;int innerres=0;for(int j=1;j<=n-i;j++){innerres++;if(a[j]>a[j+1]){flag=1;//优化 有交换标记1swap(a[j],a[j+1]);}cout<<"执行的外循环次数-->"<<outres<<"执行的内循环次数-->"<<innerres<<endl;}if(flag==0)break;//优化 有交换标记1}for(int i=1;i<=5;i++){cout<<a[i]<<" ";}return 0;
}
如:

插入排序
插入排序(Insertion sort)是一种简单直观且稳定的排序算法。如果有一个已经有序的数据序列,要求在这个已经排好的数据序列中插入一个数,但要求插入后此数据序列仍然有序,这个时候就要用到一种新的排序方法—插入排序法。
插入排序的基本操作就是将一个数据插入到已经排好序的有序数列中,从而得到一个新的、个数加一的有序数列,算法适用于少量数据的排序。

1、从第一个元素开始,该元素被认为已被排序。
2、取出下一个元素,在已排序的序列中从后往前扫描。
3、如果该元素大于新元素,将该元素移到下一个位置。
4、重复步骤3,直到找到已排序的元素小于或者等于新元素的位置。5、将新元素插入后,重复步骤2~5。
接下来我们以对序列{5,6,3,7,8,1}从小到大排序为例来讲解插入排序的具体过程。
第一步:有序序列为{5}。
第二个数6开始进行插入排序。因为5是小于6的,所以位置不
用改动。在第二个位置插入数字6,得到有序序列{5,6}。
第二步:有序序列为{5,6}。
第三个数3开始进行插入排序。由于5,6均大于3,因此数字5、6需要往后挪一个位置。然后再将3放到第一个位置。得到有序序列{3,5,6}。
第三步:有序序列为{3,5,6}。
第四个数1开始进行插入排序。由于3,5,6均大于1,因此数字3、5、6需要往后挪一个位置。然后再将1放到第一个位置。得到有序序列{1,3,5,6}。
第四步:有序序列为{1,3,5,6}。
第五个数8开始进行插入排序。由于1、3、5、6都是小于8的,所以位置不用改动。在最后一个位置插入数字8,得到有序序列{1,3,5,6,8}。
第五步:有序序列为{1,3,5,6,8}。
第七个数7开始进行插入排序。因为1、3、5、6都是小于7的,所以位置不用改动,由于8大于7,因此往后挪一个位置,然后在6和8之间插入数字7。得到有序序列{1,3,5,6,7,8}。
至此,整个插入排序过程完成。
#include <iostream>using namespace std;int a[10005];int main()
{int n;int key,j;cin>>n;for(int i=1;i<=n;i++) cin>>a[i];for(int i=2;i<=n;i++){//从第二个开始排序key=a[i]; //待记录插入的数字j=i-1;//令j=已有序列的尾位置while(j>=1&&key<a[j]) //从后往前遍历序列已有序列,直到第一个比key小的位置{a[j+1]=a[j];//当前元素比关键字大,则往前插空j--;}a[j+1]=key;//直到无法前移的时候,将key插入空出的位置}for(int i=1;i<=n;i++) cout<<a[i]<<' ';return 0;
}

题目描述


在线练习:
http://noi.openjudge.cn/
总结
本系列为C++学习系列,会介绍C++基础语法,基础算法与数据结构的相关内容。本文为C++冒泡排序与插入排序案例,包括相关案例练习。
相关文章:
C++017-C++冒泡排序与插入排序
文章目录C017-C冒泡排序与插入排序冒泡排序与插入排序目标冒泡排序排序规则冒泡排序优化插入排序题目描述在线练习:总结C017-C冒泡排序与插入排序 在线练习: http://noi.openjudge.cn/ https://www.luogu.com.cn/ 冒泡排序与插入排序 参考:…...
数据结构基础之链表
目录 前言 1、什么是链表 2、添加元素 3、虚拟头结点 4、查询&修改元素 5、删除元素 附:完整代码 前言 又到周末了,修整了一天,继续来写点东西吧,今天,我们来学习数据结构中的另一种基础的数据结构——链表…...
css 的渲染层合成是什么,浏览器如何创建新的渲染层
在 DOM 树中每个节点都会对应一个渲染对象(RenderObject),当它们的渲染对象处于相同的坐标空间(z 轴空间)时,就会形成一个 RenderLayers,也就是渲染层。渲染层将保证页面元素以正确的顺序堆叠&a…...
nacos-sdk-rust binding to NodeJs
广告时间 nacos-sdk-rust-binding-node : nacos-sdk-rust binding to NodeJs with napi. Tip: nacos-sdk-nodejs 仓库暂未提供 2.x gRPC 交互模式,为了能升级它,故而通过 node addon 方式调用 nacos-sdk-rust npm 包 -> https://www.npmjs.com/packa…...
MySQL下载安装以及环境配置教程
目录MySQL 下载MySQL 安装配置环境变量MySQL 下载 进入官方网站 https://www.mysql.com/ 点击 DOWNLOADS 进入下载页面 免费版本点击下方的 MySQL Community (GPL) Downloads 点击 MySQL Community Server 点击 Go to Download Page 进入下载页面 点击 Download 点击 No thank…...
概率论 1.3 古典概型与几何概型
1.3.1 排列与组合排列从n个不同元素任取r(r<n)个元素排成一列(考虑元素出现的先后次序),称此为一个排列,此种排列的总数为n(n-1)....(n-r1)n!/(n-r)!,若rn,则称为全排列,2.重复排列从n个不同元素中每次取出一个,放回…...
HTML DOM
通过 HTML DOM,可访问 JavaScript HTML 文档的所有元素。HTML DOM (文档对象模型)当网页被加载时,浏览器会创建页面的文档对象模型(Document Object Model)。HTML DOM 定义了用于 HTML 的一系列标准的对象,以及访问和处…...
Vue组件-$refs、$nextTick和name属性的使用
Vue组件-$refs和$nextTick使用一、获取DOM二、$refs获取组件对象三、$nextTick异步更新DOM四、组件name属性的使用一、获取DOM 通过id或ref属性获取原生DOM 在mounted生命周期 – 2种方式获取原生DOM标签 目标标签 – 添加id / ref恰当时机, 通过id / 通过ref属性 获取目标标签…...
【Spark】Spark的DataFrame向Impala写入数据异常及源码解析
背景 事情是这样的,当前业务有一个场景: 从业务库的Mysql抽取数据到Hive 由于运行环境的网络限制,当前选择的方案: 使用spark抽取业务库的数据表,然后利用impala jdbc数据灌输到hive。(没有spark on hive 的条件&…...
学习笔记-架构的演进之限流-3月day03
文章目录前言限流的目标流量统计指标限流设计模式流量计数器模式滑动时间窗模式漏桶模式令牌桶模式分布式限流总结附前言 任何一个系统的运算、存储、网络资源都不是无限的,当系统资源不足以支撑外部超过预期的突发流量时,就应该要有取舍,建…...
动态规划 背包问题
动态规划 背包问题 问题描述: 有一个背包,总容量为12。有6件物品,每件物品的重量和价值不同,求在背包总容量12的前提下,装进物品的最大价值以及装进物品的编号 单个物品重量和价值: 为方便进行思考&#…...
C++ Primer Plus 学习笔记(四)—— 内存模型和名称空间
1 单独编译 C允许将组件函数放在独立的文件即头文件中,头文件中可以包含以下内容: 函数原型;使用#define或const定义的符号常量;结构声明;类声明;模板声明;内联函数。 注意,在包含…...
详解基于 Celestia、Eclipse 构建的首个Layer3 链 Nautilus Chain
以流支付为主要概念的Zebec生态,正在推动流支付这种新兴的支付方式向更远的方向发展,该生态最初以Zebec Protocol的形态发展,并从初期的Solana进一步拓展至BNB Chian以及Near上。与此同时,Zebec生态也在积极的寻求从协议形态向公链…...
列表与数组的转化
目录用np.array(a)将列表转换为数组列表转数组的特殊情况(一)列表转数组的特殊情况(二)针对子元素个数不一致的解决办法用a.tolist()函数将数组转化为列表在python的学习中,经常会用到数组与列表的相互转化,本文主要介绍下关于数组与列表转化的问题。用n…...
docker 运行花生壳实现内外网穿透
环境:centos 7 ,64位 1、创建一个指定的文件夹作为安装示例所用,该示例文件夹为“hsk-nwct”。“hsk-nwct”内创建“app”文件夹作为docker容器挂载出来的文件。 2、在“app”内下载花生壳linux安装包,下载花生壳应用:花生壳客户…...
操作系统——16.时间片轮转、优先级、多级反馈队列算法
这篇文章我们来看一下进程调度算法中的时间片轮转、优先级、多级反馈队列算法 目录 1.概述 2.时间片轮转调度算法(RR,Round-Robin) 3.优先级调度算法 4.多级反馈队列调度算法 5.分析对比 1.概述 首先,我们来看一下这篇文章…...
Python3.8.8-Django3.2-Redis-连接池-数据类型-字符串-list-hashmap-命令行操作
文章目录1.认识Redis1.1.优点1.2.缺点2.在Django中Redis的连接3.Redis的基础用法3.1.hashmap结构3.2.list结构4.命令行查看数据库5.作者答疑1.认识Redis Remote DIctionary Server(Redis) 是一个key-value 存储系统,是跨平台的非关系型数据库。是一个开源的使用 AN…...
Android kotlin 系列讲解(进阶篇)高级项目架构模式 - MVVM
<<返回总目录 1、MVVM是什么 MVVM是Model-View-ViewModel的缩写,是一种高级项目架构模式。 MVVM架构可以将程序结构主要分成三个部分: Model:数据模型部分,包括从服务端获取的json数据或者从本地获取的数据等等View&…...
8. 查找
1 题目描述 查找成绩10开启时间2021年09月24日 星期五 18:00折扣0.8折扣时间2021年11月15日 星期一 00:00允许迟交否关闭时间2021年11月23日 星期二 00:00 输入 n(n ≤ 10^6)个不超过 10^9的单调不减的(就是后面的数字不小于前面的数字)非负整数 &#…...
二分查找算法
感谢“五点七边”工作室的算法讲解,详细内容可以参考视频讲解 二分查找为什么总是写错?_哔哩哔哩_bilibili 此处仅是个人学习总结 以target等于5为例,输入: 1 2 3 5 5 5 8 9 1. 找到第一个 > target 的元素 判断条件 < target&am…...
多云管理“拦路虎”:深入解析网络互联、身份同步与成本可视化的技术复杂度
一、引言:多云环境的技术复杂性本质 企业采用多云策略已从技术选型升维至生存刚需。当业务系统分散部署在多个云平台时,基础设施的技术债呈现指数级积累。网络连接、身份认证、成本管理这三大核心挑战相互嵌套:跨云网络构建数据…...
【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15
缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下: struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...
三维GIS开发cesium智慧地铁教程(5)Cesium相机控制
一、环境搭建 <script src"../cesium1.99/Build/Cesium/Cesium.js"></script> <link rel"stylesheet" href"../cesium1.99/Build/Cesium/Widgets/widgets.css"> 关键配置点: 路径验证:确保相对路径.…...
JavaScript 中的 ES|QL:利用 Apache Arrow 工具
作者:来自 Elastic Jeffrey Rengifo 学习如何将 ES|QL 与 JavaScript 的 Apache Arrow 客户端工具一起使用。 想获得 Elastic 认证吗?了解下一期 Elasticsearch Engineer 培训的时间吧! Elasticsearch 拥有众多新功能,助你为自己…...
【Java学习笔记】Arrays类
Arrays 类 1. 导入包:import java.util.Arrays 2. 常用方法一览表 方法描述Arrays.toString()返回数组的字符串形式Arrays.sort()排序(自然排序和定制排序)Arrays.binarySearch()通过二分搜索法进行查找(前提:数组是…...
【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器
——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的一体化测试平台,覆盖应用全生命周期测试需求,主要提供五大核心能力: 测试类型检测目标关键指标功能体验基…...
SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现
摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序,以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务,提供稳定高效的数据处理与业务逻辑支持;利用 uniapp 实现跨平台前…...
论文浅尝 | 基于判别指令微调生成式大语言模型的知识图谱补全方法(ISWC2024)
笔记整理:刘治强,浙江大学硕士生,研究方向为知识图谱表示学习,大语言模型 论文链接:http://arxiv.org/abs/2407.16127 发表会议:ISWC 2024 1. 动机 传统的知识图谱补全(KGC)模型通过…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Java毕业设计:WML信息查询与后端信息发布系统开发
JAVAWML信息查询与后端信息发布系统实现 一、系统概述 本系统基于Java和WML(无线标记语言)技术开发,实现了移动设备上的信息查询与后端信息发布功能。系统采用B/S架构,服务器端使用Java Servlet处理请求,数据库采用MySQL存储信息࿰…...
