【八大数据排序法】冒泡排序法的图形理解和案例实现 | C++

news2024/11/15 11:17:41

第十四章    冒泡排序法


目录

第十四章    冒泡排序法

●前言

●认识排序

●一、冒泡排序是什么?

1.简要介绍

2.具体情况

3.算法分析 

●二、案例实现

1.案例一

2.案例二

●总结


前言

          排序算法是我们在程序设计中经常见到和使用的一种算法,它主要是将一堆不规则的数据按照递增或递减的方式重新进行排序。在如今的互联网信息时代,随着大数据和人工智能的发展,大型企业的数据库中有亿级的用户数据量。因此对其进行处理,排序算法也就成为了其中必不可缺的步骤之一。


认识排序

        排序功能对计算机领域而言,是一项非常重要而且普遍的工作。排序中数据的移动方式可分为直接移动和逻辑移动两种方式,直接移动是直接交换存储数据的位置,而逻辑移动并不会移动数据存储的位置,仅改变指向这些数据辅助指针的值。排序通常按照数据量的多少和所使用的内存,可分为内部排序和外部排序,数据量小可以全部加载到内存来进行排序的,就称为内部排序,大部分排序属于此类。数据量大而无法一次性加载到内存中,必须借助磁带,磁盘等辅助存储器进行排序的,则称为外部排序。随着数据结构科学的进步,如今,陆续被提出的冒泡排序法,选择排序法,插入排序法,合并排序法,快速排序法,堆积排序法,希尔排序法,基数排序法,直接合并排序法等等,它们各有其特色和其应用场合。并且在算法中,我们非常关注算法程序代码的时间复杂度和空间复杂度,因为它会直接体现出我们程序代码的执行效率以及编程人员的逻辑思维等等的综合能力。当数据量相当庞大时,排序算法所花费的时间就显得相当重要,排序算法的时间复杂度可分为最好情况、最坏情况以及平均情况。另外,对于任何的排序算法都会有数据交换的操作,数据互换位置会暂时用到一个额外的空间,这也是排序算法中空间复杂度要考虑到的问题,而在排序算法中所使用的额外空间越小,它的空间复杂度就越好。


一、冒泡排序是什么?

1.简要介绍

        冒泡排序法又被称为交换排序法,它的原理思维是从第一个元素开始,比较相邻元素的大小,如果大小顺序有误,则将其交换位置后继续进行与下一个元素的比较。如此经过这样的一次扫描操作之后就可以确保最后一个元素被排到了正确的位置上。接着继续进行下一次的扫描操作,直到完成所有的元素排序即可。

2.具体情况

        通过冒泡排序法,对下图的5个数据元素进行从小到大排序:

        第一次的扫描,将第一个元素45和第二个元素22进行比较,第二个元素小于第一个元素,我们就将两者进行互换;然后将交换后的第二个元素45与第三个元素92进行比较判断,两者不需要交换位置;就这样一直进行比较判断,到第四次就可以确定该组数据的最大值已经排到了这几个数据的最后面。

         第二次的扫描也是从头开始继续进行相邻比较,但因为在第一次的扫描时我们就已经将5个数据元素中的最大值确定了出来,所以这次扫描我们只需要比较3次就可以将剩余元素的最大值排到剩余数据元素的最后面。

         第三次的扫描需要比较两次:

         第四次的扫描需要比较一次,即可完成5个数据元素的全部排序:

3.算法分析 

n个元素的冒泡排序法需要执行n-1次扫描排序操作:

        ①冒泡排序法为相邻两个数据元素进行比较判断后的排序方法,因此它不会改变原来数据排列的顺序,属于稳定排序法。

        ②冒泡排序法只需要一个额外的空间,空间复杂度为最佳的。

        ③冒泡排序法适用于数据量小的情况。

        ④该排序方法最好的情况就是只需要进行一次扫描,这一次的扫描发现不需要对该组数据进行排序的操作,表示排序已经完成,所以只会进行n-1次的比较,时间复杂度为O(n);而最坏的情况和平均情况下的时间复杂度均为O(n^2)。

二、案例实现

1.案例一

①范例情况:使用冒泡排序法对6、5、9、7、2、8这几个数据进行排序,并且输出每次扫描后的排序情况。

②代码展示:

#include<iostream>
#include<iomanip>
using namespace std;
#define size 6    //事先声明排序数据的个数
class bubble {
public:
	int data[size];
	void showresult(){
		for (int i = 0; i < size; i++)
			cout << setw(2) << data[i];
		cout << endl;
	}
	void bubble_start() {
		for (int i = 5; i > 0; i--)      //扫描次数n-1,n为6个数据元素,则扫描次数为5
		{
			for (int j = 0; j < i; j++)    //每次扫描需要比较、交换的次数
			{
				if (data[j] > data[j + 1])   //相邻比较
				{
					int temp;
					temp = data[j];
					data[j] = data[j + 1];
					data[j + 1] = temp;
				}
			}
			cout << "第" <<  size-i << "次扫描:";
			showresult();
		}
	}
};
void text()
{
	bubble b;
	cout << "请输入要排序的"<<size<<"个数据"<< endl;
	for (int i = 0; i < size; i++)
		cin>>b.data[i];
	cout << "排序前:" << endl;
	b.showresult();
	b.bubble_start();
	cout << "排序后:" << endl;
	b.showresult();
}
int main()
{
	text();
}

③结果展示:

2.案例二

①范例情况:从案例一中我们可以看出冒泡排序法有一个缺点,就是它无论数据是否排序完成它的数据比较都会固定执行n(n-1)/2次,这样可能会造成程序不能以最优时间效率执行。所以我们在程序中加入一些条件和判断语句来判断是否可以结束排序,这样不光得到了正确的排序效果还可以提高程序的效率。利用优化的冒泡排序法对4、6、2、7、8、9这6个数据进行排序。

②代码展示:

#include<iostream>
#include<iomanip>
using namespace std;
#define size 6    //事先声明排序数据的个数
class bubble {
public:
	int data[size];
	void showresult(){
		for (int i = 0; i < size; i++)
			cout << setw(2) << data[i];
		cout << endl;
	}
	void bubble_start() {
		for (int i = 5; i > 0; i--)      //扫描次数n-1,n为6个数据元素,则扫描次数为5
		{
			int flag = 0;   //定义一个标志
			for (int j = 0; j < i; j++)    //每次扫描需要比较、交换的次数
			{
				if (data[j] > data[j + 1])   //相邻比较
				{
					int temp;
					temp = data[j];
					data[j] = data[j + 1];
					data[j + 1] = temp;
					flag = 1;
				}
			}
			if (flag == 0)    //如果flag没变,说明没进行交换,则根本不需要输出这次的
				break;
			cout << "第" <<  size-i << "次扫描:";
			showresult();
		}
	}
};
void text()
{
	bubble b;
	cout << "请输入要排序的"<<size<<"个数据"<< endl;
	for (int i = 0; i < size; i++)
		cin>>b.data[i];
	cout << "排序前:" << endl;
	b.showresult();
	b.bubble_start();
	cout << "排序后:" << endl;
	b.showresult();
}
int main()
{
	text();
}

③结果展示:


 总结

        以上就是冒泡排序法的内容,算法它更让我们体会的是一种计算机编程的思想,让我们在面对不同的问题时可以充分的利用算法去解决我们所需要解决的问题。程序=算法+数据结构,所以我们可以看的出算法的重要性。对于不同的排序算法,它们在计算机不同的领域都发挥着各自的作用,熟悉了解各种排序算法并且将它们充分合理的与其他算法结合运用。那么我相信我们可以在代码的这条路上走得更高更远。

                                               <您的三连和关注是我最大的动力>

                       🚀 文章作者:Keanu Zhang        分类专栏:算法之美(C++系列文章)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/187947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

在线支付系列【10】微信支付接入前准备

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 文章目录前言1. 获取基本参数商户号&#xff08;mchid&#xff09;应用ID&#xff08;appid&#xff09;绑定商户号和应用ID2. 配置API v3密钥3. 下载并配置商户API证书3.1 简介3.2 生成证书串3.3 获得商…

卷积神经网络CNN :1.基础知识

​卷积神经网络是一种深度学习概念&#xff0c;专为处理图像而构建。机器学习是计算机从过去的经验中学习的概念。深度学习是机器学习的高级部分。CNN 旨在寻找视觉模式。 当我们人类看到图像时&#xff0c;我们看到物体、颜色等。我们在成长过程中学习这些东西&#xff0c;但计…

CRPS:贝叶斯机器学习模型的评分函数

连续分级概率评分&#xff08;Continuous Ranked Probability Score, CRPS&#xff09;或“连续概率排位分数”是一个函数或统计量&#xff0c;可以将分布预测与真实值进行比较。 机器学习工作流程的一个重要部分是模型评估。这个过程本身可以被认为是常识&#xff1a;将数据分…

【CLYZ集训】变量取值【网络流】

思路&#xff1a; 容易把答案转化为∑siwi∑ti(wx−wy)\sum{s_iw_i}\sum{t_i(w_x-w_y)}∑si​wi​∑ti​(wx​−wy​)&#xff0c;然后我们设初始代价为−∑∣si∣wi-\sum{|s_i|w_i}−∑∣si​∣wi​&#xff0c;然后考虑建模。 如果Si大于0&#xff0c;则源点向i连一条流量为2…

【Java AWT 图形界面编程】FileDialog 对话框 ( 打开文件 | 保存文件 | 构造函数 | 获取文件路径 | 获取文件名称 | 代码示例 )

文章目录一、FileDialog 对话框1、构造函数2、获取文件路径3、获取文件名称二、FileDialog 对话框代码示例一、FileDialog 对话框 在开发时 , 经常遇到文件相关操作 , 如 : 选择文件 , 保存文件 等 , 在 AWT 中使用 FileDialog 文件对话框 实现上述功能 ; 1、构造函数 FileDial…

量子计算初创公司Oxford Ionics完成3000万英镑A轮融资

&#xff08;图片来源&#xff1a;网络&#xff09;未来&#xff0c;量子计算机会解决世界上最大的超级计算机无法解决的问题。然而&#xff0c;大规模制造量子计算机仍然是一个巨大的挑战。英国量子计算初创公司Oxford IonicsA轮融资获得的3000万英镑&#xff08;约合人民币2.…

Java集合(六)Set接口和常用方法

Set接口基本介绍&#xff1a; &#xff08;1&#xff09;无序&#xff08;添加和取出的顺序不一致&#xff09;&#xff0c;没有索引 &#xff08;2&#xff09;不允许重复元素&#xff0c;所以最多包含一个null (3)JDK API中Set接口的实现类有&#xff1a; 其中set接口的已…

2023年,最新最权威的上海Java培训机构排行榜出炉!

2022也许你的很多学习和工作计划都被打乱&#xff0c;但是过去的2022不管多艰难&#xff0c;多难熬。都已经成为过去式。2023悄然而至&#xff0c;新的一年&#xff0c;你我都该有新气象新动力&#xff0c;学习什么时候开始都不晚&#xff0c;想跨行从事软件开发、IT行业的小伙…

跳槽至今0 offer的大冤种,问题到底出在哪儿?

众所周知&#xff0c;2022年市场很难&#xff01;看着企业们纷纷裁员&#xff0c;甚至连内推这个后门都走不通&#xff01;哪怕有面试&#xff0c;都是屡屡碰壁&#xff0c;你想清楚问题出在哪了吗&#xff1f;&#x1f62d;“求职不得&#xff0c;夜不能寐&#xff1b;三更半夜…

C++基础——C++ 指针

C基础——C 指针C 指针什么是指针&#xff1f;C 中使用指针C 指针详解C Null 指针C 指针的算术运算递增一个指针递减一个指针指针的比较C 指针 vs 数组C 指向指针的指针&#xff08;多级间接寻址&#xff09;C 传递指针给函数C 指针 学习 C 的指针既简单又有趣。通过指针&…

Python语言基础学习之Python基础之列表介绍和循环遍历

今天给大家分享一些Python基础 (列表基础和循环遍历介绍)&#xff0c;一起来看看吧~ 一、列表介绍 想一想&#xff1a; 字符串可以用来存储一串信息&#xff0c;那么想一想&#xff0c;怎样存储所有同学的名字呢?定义100个变量&#xff0c;每个变量存放一个学生的姓名可行吗…

LinkedList VS ArrayList~

ArrayList VS LinkedList: One: ArrayList:基于数组&#xff0c;需要连续内存LinkedList:基于双向链表&#xff0c;无需连续内存Two: ArrayList:随机访问快(指根据下标访问)LinkedList:随机访问慢(要沿着链表遍历)点击ArrayList的源码: 点击LinkedList的源码&#xff1a; Ar…

九龙证券|看好2-4月份汽车月度销量增速的逐月改善

机构指出&#xff0c;考虑到22年末购置税补助等方针到期&#xff0c;叠加春节假期消费需求的提早&#xff0c;估计年内乘用车销量绝对值及同比增速均于1月触底&#xff0c;后续方针影响、消费回暖等一期效果下&#xff0c;看好车市回暖&#xff0c;估计销量增速将于2-4月逐月回…

15.Set系列,可变参数、Collections

目录 一.Set系列 1.1 Set系列集合特点 1.2 Set集合实现类特点 1.3 HashSet 1.3.1 特点 1.3.2 优点 1.3.3 在理解原理之前要知道的几个概念。 1.3.4 底层原理 1.3.5 哈希表的形成过程/元素的存入过程&#xff08;Jdk8的版本&#xff09; 1.3.6 注意事项 1.4 linkedHa…

通用数字支付网络(UDPN)于达沃斯论坛期间正式发布

2023年1月19日&#xff0c;在瑞士达沃斯举行的世界经济论坛 (WEF) 会议期间&#xff0c;通用数字支付网络 (Universal Digital Payment Network, UDPN)正式对外发布。 近年来&#xff0c;全球各国央行数字货币&#xff08;CBDC&#xff09;得到了广泛的关注与长足的进步&#…

WebHooks

webhook 究竟是什么呢&#xff1f; Webhook是一个API概念&#xff0c;webhoo是一种web回调或者http的push API。Webhook作为一个轻量的事件处理应用&#xff0c;正变得越来越有用。 具体的说&#xff0c;webhook 是应用给其它应用提供实时信息的一种方式。信息一产生&#xf…

Js如何实现当网页超过一屏时导航菜单始终置顶-吸顶盒效果

前言我们平时在逛一些电商网站时,无论是首页还是详情页,通常会有一个导航菜单石红跟随着页面,无论是页面滚动到中间还是底部这是为了方便用户查看商品的各类信息或提交订单购物也就是吸顶盒效果,那这个效果是怎么实现的?原生Js如下是原生js// 初始化函数 function init() {// …

[Pytorch] CIFAR-10数据集的训练和模型优化

本篇文章借鉴了我的朋友Jc的报告&#xff0c;他是一个十分优秀的人。 本篇文章记录了第一次完整训练优化的过程 0 关于数据集 在CIFAR-10 dataset的介绍中&#xff0c;cifar-10数据集一共10类图片&#xff0c;每一类有6000张图片&#xff0c;加起来就是60000张图片&#xff0…

深度卷积对抗神经网络 基础 第五部分 Inception-v3 architecture GANs

深度卷积对抗神经网络 基础 第五部分 Inception-v3 architecture GANs 对抗神经网络能够产生不存在的图片&#xff0c;换脸或者生成一些艺术品&#xff0c;这些有趣和强大的对抗神经网络的能力不仅能够创造价值&#xff0c;还能够用来犯罪。With Great Power , Comes With Res…

3.1.1 类和对象

文章目录1.类2.对象3.类和对象的关系4.类的创建使用5.对象在内存中的存储过程6.对象创建过程分析1.类 java最基本的单位就是类&#xff0c;可以理解为类型类是一类事物的抽象可以理解为模板或者设计图纸 注意:类在现实世界并不存在,它只是一种对象的数据类型。例如乌鸦&#…