C++ · 冒泡排序与选择排序

2023-10-27

九月份的第一篇文章

好久没更新了,想起上一次更新还是在上一次,那今天咱们来聊一聊C++中的冒泡排序选择排序

冒泡排序

排序原理与思想

依次比较相邻的两个数,把大的放前面,小的放后面。即首先比较第1个数和第2个数,大数放前,小数放后。然后比较第2个数和第3个数…直到比较最后两个数。第一趟结束,最大的数一定排在最后。

重复上过程,仍从第1个数开始,到最后第2个数,然后…
由于在排序过程中总是小数往前,大数往后,相当于气泡上升,所以称作冒泡排序

程序实现

循环实现,双层嵌套循环控制每一个数字并排序,可以用if语句实现判断,然后使用swap函数将两个数调换位置,并且要加一个flag变量,它的作用是:排完序后,直接跳出循环
代码实现:

#include <bits/stdc++.h>
using namespace std;

int main ()
{
	int n,ch[1005],flag=0; //n表示要排序的数字数量,ch是数字列表,flag如上所述
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ch[i]; //输入每一项
	}
	/*
	  ...其余代码区(1处)
	*/
	for(int i=1;i<=n;i++){
		cout<<ch[i]<<" "; //输出
	}
    return 0;
}

输入和输出搞定了。接下来,我们实现排序程序

for(int i=1;i<=n;i++){
	flag=0; //flag为0时,表示未排序,反之,flag为1时,表示已排序
	for(int j=1;j<=n-1;j++){
		if(ch[j]>ch[j+1]){ //判断
			flag=1; //已排序标记
			swap(ch[j],ch[j+1]); //swap函数调换位置
			/*int temp=ch[j];
			ch[j]=ch[j+1];
			ch[j+1]=temp;*/
		}
	}
	if(flag==0){ //如果已排序,跳出循环
		break;
	}
}

直接将这块代码加入到1处代码区即可运行
完整代码如下:

#include <bits/stdc++.h>
using namespace std;

int main ()
{
	int n,ch[1005]={0},flag=0; //ch数组归零
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ch[i];
	}
	for(int i=1;i<=n;i++){
		flag=0;
		for(int j=1;j<=n-1;j++){
			if(ch[j]>ch[j+1]){
				flag=1;
				swap(ch[j],ch[j+1]);
				/*int temp=ch[j];
				ch[j]=ch[j+1];
				ch[j+1]=temp;*/
			}
		}
		if(flag==0){
			break;
		}
	}
	for(int i=1;i<=n;i++){
		cout<<ch[i]<<" ";
	}
    return 0;
}

test1
当然,你也可以把数组ch的类型改成double型,让程序可以为小数排序
代码如下:

#include <bits/stdc++.h>
using namespace std;

int main ()
{
	int n,flag=0;
	double ch[1005]={0.0}; //数组归零
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>ch[i];
	}
	for(int i=1;i<=n;i++){
		flag=0;
		for(int j=1;j<=n-1;j++){
			if(ch[j]>ch[j+1]){
				flag=1;
				swap(ch[j],ch[j+1]);
				/*int temp=ch[j];
				ch[j]=ch[j+1];
				ch[j+1]=temp;*/
			}
		}
		if(flag==0){
			break;
		}
	}
	for(int i=1;i<=n;i++){
		cout<<ch[i]<<" ";
	}
    return 0;
}

test2


题外话:swap函数的用法

swap函数可以交换数组中两个下标不同的值,需要注意语法
交换数组中两个下标不同的值:

#include <bits/stdc++.h>
using namespace std;

int main ()
{
	int a[5];
	for(int i=0;i<5;i++){
		cin>>a[i];
	}
	swap(a[0],a[1]); //交换数组a中第一项与第二项的值
	for(int i=0;i<5;i++){
		cout<<a[i]<<" ";
	}
    return 0;
}


请注意,swap函数与sort函数一样,都是没有返回值的函数,因此,我们必须要写输出才能将数组中的数据显示出来


选择排序

排序原理与思想

每一趟从待排序的数据元素中选出最小(或最大)的一个元素,顺序放在待排序的数列的最前,直到全部待排序的数据元素排完。
示例:
初始 列表 [49 38 65 97 76 13 27 49]
第一趟排序后 13[38 65 97 76 49 27 49
第二趟排序后 13 27[65 97 76 49 38 49
第三趟排序后 13 27 38 [97 76 49 65 49]
第四趟排序后 13 27 38 49 [76 97 65 49]
第五趟排序后 13 27 38 49 49 [97 65 76]
第六趟排序后 13 27 38 49 49 65 [97 76]
第七趟排序后 13 27 38 49 49 65 76 [97]
最后排序结果 13 27 38 49 49 65 76 97

程序实现

采用“打擂台”的思想,找出数组中的最大值或最小值,调换位置,这一轮排序结束。
如果还有同学不知道怎样找出最大值或最小值,可以看看我的这篇文章:C++找最大/最小值

代码实现:

#include <bits/stdc++.h>
using namespace std;

int main () {
	int n,ch[1005];
	cin>>n;

	for(int i=1;i<=n;i++) {
		cin>>ch[i];
	}
	/*
	  ...其余代码区(2处)
	*/
	for(int i=1;i<=n;i++){
		cout<<ch[i]<<" ";
	}
	return 0;
}

我们来写排序的代码,将以下代码复制到2处代码区即可:

for(int i=1;i<=n-1;i++){
	int minn=99999,k;
	for(int j=i;j<=n;j++){
		if(ch[j]<minn){
			minn=ch[j]; //最小值
			k=j; //序号
		}
	}
	swap(ch[i],ch[k]); //调换顺序
	/*
	int tmp=a[i];
	a[i]=a[k];
	a[k]=tmp;
	*/
}

完整代码:

#include <bits/stdc++.h>
using namespace std;

int main () {
	int n,ch[1005];
	cin>>n;

	for(int i=1;i<=n;i++) {
		cin>>ch[i];
	}
	for(int i=1;i<=n-1;i++){
		int minn=99999,k;
		for(int j=i;j<=n;j++){
			if(ch[j]<minn){
				minn=ch[j];
				k=j;
			}
		}
		swap(ch[i],ch[k]);
		/*
		int tmp=a[i];
		a[i]=a[k];
		a[k]=tmp;
		*/
	}
	for(int i=1;i<=n;i++){
		cout<<ch[i]<<" ";
	}
	return 0;
}


你也可以对程序稍作修改,使其可以用最大值排序或者从大往小排序,这里就不加赘述啦


好的,那这就是本期的全部内容,如果你喜欢我的文章,记得点赞加关注哦,咱们下期再见!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++ · 冒泡排序与选择排序 的相关文章

  • 为什么使用abs()或fabs()而不是条件否定?

    在 C C 中 为什么要使用abs or fabs 不使用以下代码即可查找变量的绝对值 int absoluteValue value lt 0 value value 这与较低级别的指令较少有关吗 您提出的 有条件的abs 并不等于std
  • 在 C++ 中分割大文件

    我正在尝试编写一个程序 该程序接受一个大文件 任何类型 并将其分成许多较小的 块 我想我已经有了基本的想法 但由于某种原因我无法创建超过 12 kb 的块大小 我知道谷歌等上有一些解决方案 但我更感兴趣的是了解这个限制的根源是什么 然后实际
  • 在 C++11 中省略返回类型

    我最近发现自己在 C 11 模式下的 gcc 4 5 中使用了以下宏 define RETURN x gt decltype x return x 并编写这样的函数 template
  • Linux TUN/TAP:无法从 TAP 设备读回数据

    问题是关于如何正确配置想要使用 Tun Tap 模块的 Linux 主机 My Goal 利用现有的路由软件 以下为APP1和APP2 但拦截并修改其发送和接收的所有消息 由Mediator完成 我的场景 Ubuntu 10 04 Mach
  • std::map 和二叉搜索树

    我读过 std map 是使用二叉搜索树数据结构实现的 BST 是一种顺序数据结构 类似于数组中的元素 它将元素存储在 BST 节点中并按其顺序维护元素 例如如果元素小于节点 则将其存储在节点的左侧 如果元素大于节点 则将其存储在节点的右侧
  • 调试内存不足异常

    在修复我制作的小型 ASP NET C Web 应用程序的错误时 我遇到了 OutOfMemoryException 没有关于在哪里查看的提示 因为这是一个编译时错误 如何诊断此异常 我假设这正是内存分析发挥作用的地方 有小费吗 Thank
  • 为什么 BOOST_FOREACH 不完全等同于手工编码的?

    From 增强文档 http www boost org doc libs 1 48 0 doc html foreach html foreach introduction what is literal boost foreach li
  • 如何在 VS 中键入时显示方法的完整文档?

    标题非常具有描述性 是否有任何扩展可以让我看到我正在输入的方法的完整文档 我想查看文档 因为我可以在对象浏览器中看到它 其中包含参数的描述和所有内容 而不仅仅是一些 摘要 当然可以选择查看所有覆盖 它可能是智能感知的一部分 或者我不知道它并
  • VS30063:您无权访问 https://dev.azure.com

    我正在尝试在 asp net core 2 1 mvc 应用程序中使用以下代码连接 Azure DevOps Uri orgUrl new Uri https dev azure com xxxxx String personalAcces
  • 如何用 kevent() 替换 select() 以获得更高的性能?

    来自Kqueue 维基百科页面 http en wikipedia org wiki Kqueue Kqueue 在内核和用户空间之间提供高效的输入和输出事件管道 因此 可以修改事件过滤器以及接收待处理事件 同时每次主事件循环迭代仅使用对
  • 用于从字符串安全转换的辅助函数

    回到 VB6 我编写了一些函数 让我在编码时无需关心字符串的 null 和 数字的 null 和 0 等之间的区别 编码时 没有什么比添加特殊情况更能降低我的工作效率了用于处理可能导致一些不相关错误的数据的代码 9999 10000 如果我
  • std::bind 重载解析

    下面的代码工作正常 include
  • 过期时自动重新填充缓存

    我当前缓存方法调用的结果 缓存代码遵循标准模式 如果存在 则使用缓存中的项目 否则计算结果 在返回之前将其缓存以供将来调用 我想保护客户端代码免受缓存未命中的影响 例如 当项目过期时 我正在考虑生成一个线程来等待缓存对象的生命周期 然后运行
  • Silverlight Datagrid:在对列进行排序时突出显示整个列

    我的 Silverlight 应用程序中有一个 DataGrid 我想在对该列进行排序时突出显示整个列 它在概念上与上一个问题类似 Silverlight DataGrid 突出显示整列 https stackoverflow com qu
  • 32位PPC rlwinm指令

    我在理解上有点困难rlwinmPPC 汇编指令 旋转左字立即然后与掩码 我正在尝试反转函数的这一部分 rlwinm r3 r3 0 28 28 我已经知道什么了r3 is r3在本例中是一个 4 字节整数 但我不确定这条指令到底是什么rlw
  • 如何检测 C# 中该字典键是否存在?

    我正在使用 Exchange Web 服务托管 API 和联系人数据 我有以下代码 即功能性的 但并不理想 foreach Contact c in contactList string openItemUrl https service
  • 为什么我使用google'smtp'无法发送电子邮件?

    我有以下程序使用 smtp gmail com 587 发送电子邮件 namespace TestMailServer class Program static void Main string args MailMessage mail
  • 如何查明CONFIG_FANOTIFY_ACCESS_PERMISSIONS是否启用?

    我想利用fanotify 7 http man7 org linux man pages man7 fanotify 7 html我遇到的问题是在某些内核上CONFIG FANOTIFY ACCESS PERMISSIONS不起作用 虽然C
  • 为什么 Ajax.BeginForm 在 Chrome 中不起作用?

    我正在使用 c NET MVC2 并尝试创建一个 ajax 表单来调用删除数据库记录 RemoveRelation 的方法 删除记录的过程正在按预期进行 删除记录后 表单应调用一个 JavaScript 函数 从视觉效果中删除该记录 Rem
  • 从类模板参数为 asm 生成唯一的字符串文字

    我有一个非常特殊的情况 我需要为类模板中声明的变量生成唯一的汇编程序名称 我需要该名称对于类模板的每个实例都是唯一的 并且我需要将其传递给asm关键字 see here https gcc gnu org onlinedocs gcc 12

随机推荐

  • OpenGL实现通用GPU计算概述

    可能比较早一点做GPU计算的开发人员会对OpenGL做通用GPU计算 随着GPU计算技术的兴起 越来越多的技术出现 比如OpenCL CUDA OpenAcc等 这些都是专门用来做并行计算的标准或者说接口 OpenGL用来做通用GPU计算主
  • Lora模块的定向传输

    原子哥的 两个LORA模块工作在一般模式定向传输数据的测试方法 使用上位机测试 OpenEdv 开源电子网 1 准备两LORA模块和两USB转TTL电路 2 ATK LORA 01配置软件 模块A占用COM10 模块B占用COM22 端口号
  • vue3实现mapbox鼠标定位显示经纬度

    vue3实现鼠标定位显示经纬度 leafletMap on mousemove function e var location leafletMap queryRenderedFeatures e point document getEle
  • c#基础知识---匿名方法

    我们已经提到过 委托是用于引用与其具有相同标签的方法 换句话说 您可以使用委托对象调用可由委托引用的方法 匿名方法 Anonymous methods 提供了一种传递代码块作为委托参数的技术 匿名方法是没有名称只有主体的方法 在匿名方法中您
  • Linux学习笔记——Linux命令行使用技巧

    目录 一 前言 二 Linux是什么 三 关于shell的使用 1 shell命令行提示符 2 shell打开方式 1 右键打开 此方式打开的shell在当前用户的桌面上 2 Application gt System tools gt t
  • Linux系统命令 - 查看内存使用情况

    一 查看内存使用情况 在Linux系统中 大部分操作都通过命令行来完成 因为大部分情况下不开启图形界面 在服务器环境 则只能通过shell执行操作 下面介绍查看内存使用情况的相关命令 包括物理内存 RAM 和交换内存 swap 我们经常需要
  • 前端面试总结之CSS

    文章目录 1 BFC 块级格式化上下文 重点关注 2 CSS盒子模型 3 清除浮动 4 隐藏元素的方法及各自的特点 5 line height和heigh区别 6 用CSS画三角形 7 圣杯布局 三栏布局方式两边固定中间自适应 与双飞翼布局
  • CGAL几何库配置教程

    1 下载源码 进入CGAL官网 下载源码压缩包 GMP库和MPFR库 图1 官方配置教程如图2所示 可供参考 图2 要下载的文件如图3所示
  • 机器学习之决策树

    http t csdn cn 2sWSP决策树 http t csdn cn NdlCs next and iter 函数 http t csdn cn tRN4I sort values and value counts 函数 http
  • Python往excel表格里面插入图片并控制图片的大小

    coding UTF 8 import xlrd import xlwt import requests import json import xlsxwriter from xlutils copy import copy import
  • 【课程设计】数据库:火车票管理系统

    课程设计 数据库 火车票管理系统 摘要 本文主要介绍了火车票管理系统 其中包括其选题功能概述 对该系统的方案方法设计 以及过程实现等内容 由于系统的代码量较大 因此将会较为抽象地对思想进行介绍 在必要时会举出一些实例 还会附上成果展示以及安
  • 线程池创建类ThreadPoolExecutor介绍

    ThreadPoolExecutor 使用给定的初始参数和默认线程工厂和拒绝的执行处理程序创建一个新的线程池执行器 一 构造方法参数说明 有四个构造方法 最终都是调用构造方法四 构造方法参数说明 param corePoolSize 保留在
  • APK反编译

    一 需要的工具 apktool 反编译APK文件 得到classes dex文件 同时也能获取到资源文件以及布局文件 下载地址 dex2jar 将反编译后的classes dex文件转化为 jar文件 下载地址 jd gui 用于查看 ja
  • 嵌入式C语言总结

    GCC知识梳理 Q GCC是什么 GCC最初名称 GNU C Compiler 随着其支持的语言越来越多 改称为 GNU Compiler Collection 作用 将编程高级语言翻译为机器语言 Q C语言变成机器指令的过程 gcc 根据
  • web开发-高德地图api2.0-点聚合-包含设置非聚合点的事件绑定以及样式

    web开发 高德地图api2 0 点聚合 包含设置非聚合点的事件绑定以及样式 下面展示一些 内联代码片 非聚合点数据 lnglat里的坐标不一定要双引号 var points weight 8 lnglat 108 939621 34 34
  • Monitoring(监控)

    Monitoring and Instrumentation 有几种方法可以监控Spark应用程序 Web UI 指标和外部检测 Web Interfaces 默认情况下 每个SparkContext都会在端口4040上启动Web UI 以
  • P2661 信息传递(tarjan求强连通分量模板题)

    minn为最小强连通分量的点数 include
  • 企业微信PC版应用跳转到默认浏览器,避坑指南,欢迎补充。。。

    文章目录 引子 坑一 写代码 前端页面 后端代码 企业微信设置 坑二 网页授权及JS SDK 坑三 配置企业可信IP 最后 引子 我们公司内部用企业微信沟通 最近有个需求 一个应用在企业微信PC版打开时 要自动跳转到PC的默认浏览器 在开发
  • Java 奇偶分离

    public class MiddleHalf public static void main String args int nums 1 4 3 5 0 3 10 int result sortArrayByParity nums fo
  • C++ · 冒泡排序与选择排序

    九月份的第一篇文章 好久没更新了 想起上一次更新还是在上一次 那今天咱们来聊一聊C 中的冒泡排序与选择排序 冒泡排序 排序原理与思想 依次比较相邻的两个数 把大的放前面 小的放后面 即首先比较第1个数和第2个数 大数放前 小数放后 然后比较