当前位置: 首页 > news >正文

八大排序(二)--------冒泡排序

本专栏内容为:八大排序汇总 通过本专栏的深入学习,你可以了解并掌握八大排序以及相关的排序算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:八大排序汇总
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

无论你学习哪种编程语言,在学到循环和数组时,通常都会介绍一种排序算法来作为例子,而这个算法一般就是冒泡排序。并不是它的名称很好听,而是说这个算法的思路最简单,最容易理解。因此,哪怕大家可能都已经学过冒泡排序了,我们还是从这个算法开始我们的排序之旅

在这里插入图片描述

冒泡排序

  • 最简单排序的实现
  • 冒泡排序算法
  • 冒泡排序优化
  • 冒泡排序复杂度分析

在这里插入图片描述

最简单排序的实现

冒泡排序(Bubble Sort)是一种交换排序,它的基本思想是:两两比较相邻记录的关键字,如果反序则交换,直到没有反序的记录为止。

冒泡的实现在细节上可以有很多种变化,我们将分别就3种不同的冒泡实现代码,来讲解冒泡排序的思想。这里,我们就先来看看比较容易理解的一段。

注意:排序用到的结构与函数在第一部分:排序的基本概念与分类。我们已经实现。详情请点击:八大排序(一)--------排序的基本概念与分类


//对顺序表L作交换排序(冒泡排序初级版本)
void BubbleSort0(SqList* L)
{int i = 0, j = 0;for (i = 1; i < L->length; i++){for (j = i+1; j <= L->length; j++){if (L ->r[i] > L->r[j]){swap(L, i, j);   //交换L->r[i]与r->[j]}}}
}

这段代码严格意义上说,不算是标准的冒泡排序算法,因为它不满足“两两比较相邻记录”的冒泡排序思想,它更应该是最简单的交换排序而已。它的思路就是让每一个关键字,都和它后面的每一个关键字比较,如果大则交换,这样第一位置的关键字在一次循环后一定变成最小值。

如下图所示,假设我们待排序的关键字序列是{9,1,5,8,3,7,4,6,2}
当i=1时,9与1交换后,在第一位置的1与后面的关键字比较都小,因此它就是最小值。

当i=2时,第二位置先后由9换成5,换成3,换成2,完成了第二小的数字交换。后面的数字变换类似,这里不再介绍。

这应该算是最容易写出的排序代码了,不过这个简单易懂的代码,却是有缺陷的。观察后发现,在排序好1和2的位置后,对其余关键字的排序没有什么帮助(数字3反而还被换到了最后一位)。也就是说,这个算法的效率是非常低的。
在这里插入图片描述

冒泡排序算法

我们来看看正宗的冒泡算法,有没有什么改进的地方。


//对顺序表L作冒泡排序
void BubbleSort(SqList* L)
{int i = 0, j = 0;for (i = 1; i < L->length; i++){for (j = L->length-1; j >= i; j--)    //j从后往前循环{if (L->r[i] > L->r[j+1])          //若前者大于后者{swap(L, i, j+1);   //交换L->r[i]与r->[j+1]的值}}}
}

依然假设我们待排序的关键字序列是{9,1,5,8,3,7,4,6,2}

当i=1时,变量j由8反向循环到1,逐个比较,将较小值交换到前面,直到最后找到最小值放置在了第1的位置。

如下图所示,当i=1,j=8时,我们发现6>2,因此交换了它们的位置,j=7时,4>2,所以交换……直到=2时,因为1<2,所以不交换。j=1时,9>1,交换,最终得到最小值1放置第1的位置。

事实上,在不断循环的过程中,除了将关键字1放到第1的位置,我们还将关键字2从第9位置提到了第3的位置,显然这一算法比前面的要有进步,在上十万条数据的排序过程中,这种差异会体现出来。图中较小的数字如同气泡般慢慢浮到上面,因此就将此算法命名为冒泡算法。
在这里插入图片描述
后面的数字变换就很简单,这里就不在叙述了。

冒泡排序优化

这样的冒泡程序是否还可以优化呢?答案是肯定的。试想一下,如果我们待排序的序列是{2,1,3,4,5,6,7,8,9}也就是说,除了第1和第2的关键字需要交换外,别的都已经是正常的顺序。

当i=1时,交换了2和1,此时序列已经有序,但是算法仍然不依不饶地将i=2~9以及每个循环中的循环都执行了一遍,尽管并没有交换数据,但是之后的大量比较还是大大地多余了,如下图所示。
在这里插入图片描述
当i=2时,我们已经对9与8,8与7,…,3与2作了比较,没有任何数据交换,这就说明此序列已经有序,不需要再继续后面的循环判断工作了。为了实现这个想法,我们需要改进一下代码,增加一个标记变量flag来实现这一算法的改进。

//对顺序表L作冒泡排序(改进版本)
void BubbleSort(SqList* L)
{int i = 0, j = 0;status flag = 1;                          //用flag进行标记for (i = 1; i < L->length && flag; i++)   //若flag为1则有效数据交换{flag = 0;for (j = L->length-1; j >= i; j--)    //j从后往前循环{if (L->r[i] > L->r[j+1])          //若前者大于后者{swap(L, i, j+1);              //交换L->r[i]与r->[j+1]的值flag = 1;                     //如果有数据交换,则flag为1}}}
}

代码改动的关键就是在变量的for循环中,增加了对flag是否为1的判断。

经过这样的改进,冒泡排序在性能上就有了一些提升,可以避免已经有序的情况下的无意义循环判断

冒泡排序复杂度分析

分析一下它的时间复杂度

最好的情况,也就是要排序的表本身就是有序的,那么我们比较次数,根据最后改进的代码,可以推断出就是n-1次的比较,没有数据交换,时间复杂度为O(n)。

最坏的情况,即待排序表是逆序的情况,此时需要比较之 ∑ i = 2 n ( i − 1 ) = 1 + 2 + 3 + … + ( n − 1 ) = n ( n − 1 ) / 2 \sum_{i=2}^n (i-1)=1+2+3+…+(n-1)=n(n-1)/2 i=2n(i1)=1+2+3++(n1)=n(n1)/2次,并作等数量级的记录移动。因此,总的时间复杂度为O(n2)。

相关文章:

八大排序(二)--------冒泡排序

本专栏内容为&#xff1a;八大排序汇总 通过本专栏的深入学习&#xff0c;你可以了解并掌握八大排序以及相关的排序算法。 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;八大排序汇总 &#x1f69a;代码仓库&#xff1a;小小unicorn的代码仓库…...

SmartSQL 一款开源的数据库文档管理工具

建议直接蓝奏云下载安装 蓝奏云下载&#xff1a;https://wwoc.lanzoum.com/b04dpvcxe 蓝奏云密码&#xff1a;123 项目介绍 SmartSQL 是一款方便、快捷的数据库文档查询、导出工具&#xff01;从最初仅支持 数据库、CHM文档格式开始&#xff0c;通过不断地探索开发、集思广…...

代码随想录算法训练营第56天 | ● 583. 两个字符串的删除操作 ● 72. 编辑距离 ● 动态规划之编辑距离总结篇

文章目录 前言一、583. 两个字符串的删除操作二、72. 编辑距离三、动态规划之编辑距离总结篇总结 前言 一、583. 两个字符串的删除操作 两种思路&#xff1a;1.直接动态规划&#xff0c;求两个字符串需要删除的最小次数 2.采用子序列的和-最长公共子序列。思路一分析如下&#…...

矩阵 m * M = c

文章目录 题1题2 题1 (2023江苏领航杯-prng) 题目来源&#xff1a;https://dexterjie.github.io/2023/09/12/%E8%B5%9B%E9%A2%98%E5%A4%8D%E7%8E%B0/2023%E9%A2%86%E8%88%AA%E6%9D%AF/ 题目描述&#xff1a; (没有原数据&#xff0c;自己生成的数据) from Crypto.Util.number…...

Linux——IO

✅<1>主页&#xff1a;&#xff1a;我的代码爱吃辣 &#x1f4c3;<2>知识讲解&#xff1a;Linux——文件系统 ☂️<3>开发环境&#xff1a;Centos7 &#x1f4ac;<4>前言&#xff1a;是不是只有C/C有文件操作呢&#xff1f;python&#xff0c;java&…...

svn(乌龟svn)和SVN-VS2022插件(visualsvn) 下载

下载地址: https://www.visualsvn.com/visualsvn/download/...

开源日报 0824 | 构建UI组件和页面的前端工作坊

Storybook 是一个用于构建 UI 组件和页面的前端工作坊&#xff0c;支持多种主流框架&#xff0c;提供丰富的插件&#xff0c;具有可配置性强和扩展性好的特点。 storybookjs/storybook Stars: 79.9k License: MIT Storybook 是一个用于构建 UI 组件和页面的前端工作坊&#x…...

福建三明大型工程机械3D扫描工程零件三维建模逆向抄数-CASAIM中科广电

高精度3D扫描技术已经在大型工件制造领域发挥着重要作用&#xff0c;可以高精度高效率实现全尺寸三维测量&#xff0c;本期&#xff0c;我们要分享的应用是大型工程机械3D扫描案例。 铣轮是深基础施工领域内工法先进、技术复杂程度高、高附加值的地连墙设备&#xff0c;具有成…...

使用香橙派学习 Linux的守护进程

Q&#xff1a;什么是守护进程 A&#xff1a;Linux Daemon&#xff08;守护进程&#xff09;是运行在后台的一种特殊进程。它独立于控制终端并且周期性地执行 某种任务或等待处理某些发生的事件。它不需要用户输入就能运行而且提供某种服务&#xff0c;不是对整个系统就是对某个…...

数据治理-数据仓库和商务智能

数据仓库的作用 减少数据冗余&#xff0c;提高信息一致性&#xff0c;让企业能够利用数据做出更优决策的方法&#xff0c;数据仓库是企业数据管理的核心。 业务驱动因素 运营支持职能、合规需求&#xff08;历史数据响应&#xff09;和商务智能活动&#xff08;主因&#xff1…...

CH2--x86系统架构概览

2.1 OVERVIEW OF THE SYSTEM-LEVEL ARCHITECTURE 图中的实线箭头表示线性地址&#xff0c;虚线表示段选择器&#xff0c;虚线箭头表示物理地址 2.1.1 Global and Local Descriptor Tables 全局描述符表 (GDT) GDT是一个全局的段描述符表&#xff0c;它存储在系统内存中的一个固…...

Immutable.js API 简介

Immutable-js 这个库的实现是深拷贝还是浅拷贝&#xff1f;immutable 来源immutable.js三大特性&#xff1a; 持久化数据结构结构共享惰性操作 Immutable.js 的几种数据类型 immutable 使用 使用 npm 安装 immutable&#xff1a; 常用API介绍 MapListList.isList() 和 Map.isMa…...

HLSL 入门(一)

HLSL High Level Shader Language 高级着色语言&#xff0c;是Direct3D中用来编写Shader的语言。其语法类似于C语言。 虽然其主要作用是用来编写例如顶点着色器&#xff0c;像素着色器。但本质是对图形并行管线进行编程&#xff0c;因此也能用来编写用于计算的着色器&#xff…...

【Docker】挂载数据卷

一、Docker数据卷说明及操作 在Docker中挂载数据卷是一种将数据持久化保存的方法&#xff0c;以便容器之间或容器与主机之间共享数据。以下是如何在Docker中挂载数据卷的步骤&#xff1a; 1、创建数据卷 首先&#xff0c;您需要创建一个数据卷。可以使用以下命令创建一个数据卷…...

[技术干货]spring 和spring boot区别

Spring 和 Spring Boot 都是 Java 框架&#xff0c;用于构建企业级应用程序。Spring 是一个完整的框架&#xff0c;提供各种功能&#xff0c;包括依赖注入、事务管理、数据访问、Web 开发等。Spring Boot 是一个基于 Spring 的框架&#xff0c;旨在简化 Spring 应用程序的开发和…...

【hudi】数据湖客户端运维工具Hudi-Cli实战

数据湖客户端运维工具Hudi-Cli实战 help hudi:student_mysql_cdc_hudi_fl->help AVAILABLE COMMANDSArchived Commits Commandtrigger archival: trigger archivalshow archived commits: Read commits from archived files and show detailsshow archived commit stats: …...

RK3588 添加ROOT权限

一.ROOT简介 ROOT权限是Linux和Unix系统中的超级管理员用户帐户&#xff0c;该帐户拥有整个系统的最高权利&#xff0c;可以执行几乎所有操作。ROOT就是获取安卓系统中的最高用户权限&#xff0c;以便执行一些需要高权限才能执行的操作(包括卸载系统自带程序、刷机、备份、还原…...

【云原生】k8s-----集群调度

目录 1.k8s的list-watch机制 1.1 list-watc机制简介 1.2 根据list-watch机制&#xff0c;pod的创建流程 2.scheduler的调度策略 2.1 scheduler的调度策略简介 2.2 Scheduler预选策略的算法 2.3 Scheduler优选策略的算法 3. k8s中的标签管理及nodeSelector和nodeName的 调…...

一键集成prometheus监控微服务接口平均响应时长

一、效果展示 二、环境准备 prometheus + grafana环境 参考博文:https://blog.csdn.net/luckywuxn/article/details/129475991 三、导入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter...

2023/9/13 -- C++/QT

作业&#xff1a; 1> 将之前定义的栈类和队列类都实现成模板类 栈&#xff1a; #include <iostream> #define MAX 40 using namespace std;template <typename T> class Stack{ private:T *data;int top; public:Stack();~Stack();Stack(const Stack &ot…...

mybatis mapper.xml转建表语句

从网上下载了代码&#xff0c;但是发现没有DDL建表语句&#xff0c;只能自己手动创建了&#xff0c;感觉太麻烦&#xff0c;就写了一个工具类 将所有的mapper.xml放入到一个文件夹中&#xff0c;程序会自动读取生成建表语句 依赖的jar <dependency><groupId>org.d…...

封装使用Axios进行前后端交互

Axios是一个强大的HTTP客户端&#xff0c;用于在Vue.js应用中进行前后端数据交互。本文将介绍如何在Vue中使用Axios&#xff0c;并通过一个企业应用场景来演示其实际应用。 Axios简介 公众号&#xff1a;Code程序人生&#xff0c;个人网站&#xff1a;https://creatorblog.cn A…...

SOA、分布式、微服务

SOA&#xff1a; SOA是一种软件设计架构&#xff0c;用于构建分布式系统和应用程序。它将应用程序拆分为一系列松耦合的服务&#xff0c;这些服务通过标准化的接口进行通信&#xff0c;并能够以可编程方式组合和重用。SOA的目标是提高系统的灵活性、可扩展性和可维护性。 特点&…...

json数据传输压缩以及数据切片分割分块传输多种实现方法,大数据量情况下zlib压缩以及bytes指定长度分割

json数据传输压缩以及数据切片分割分块传输多种实现方法&#xff0c;大数据量情况下zlib压缩以及bytes指定长度分割。 import sys import zlib import json import mathKAFKA_MAX_SIZE 1024 * 1024 CONTENT_MIN_MAX_SIZE KAFKA_MAX_SIZE * 0.9def split_data(data):"&q…...

移动端APP测试-如何指定测试策略、测试标准?

制定项目的测试策略是一个重要的步骤&#xff0c;可以帮助测试团队明确测试目标、测试范围、测试方法、测试资源、测试风险等&#xff0c;从而提高测试效率和质量。本篇是一些经验总结&#xff0c;理论分享。并不是绝对正确的&#xff0c;也欢迎大家一起讨论。 文章目录 一、测…...

【Redis】深入探索 Redis 主从结构的创建、配置及其底层原理

文章目录 前言一、对 Redis 主从结构的认识1.1 什么是主从结构1.2 主从结构解决的问题 二、主从结构创建2.1 配置并建立从节点2.2.1 从节点配置文件2.2.2 启动并连接 Redis 主从节点2.2.3 SLAVEOF 命令2.2.4 断开主从关系 2.2 查看主从节点的信息2.2.1 INFO REPLICATION 命令2.…...

CSS 滚动驱动动画 scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis )

scroll-timelinescroll-timeline-name❤️scroll-timeline-axis 解决问题语法 animation-timeline-nameanimation-timeline-axis scroll-timeline ( scroll-timeline-name ❤️ scroll-timeline-axis ) 在 scroll() 的最后我们遇到了因为定位问题导致滚动效果失效的情况, 当…...

9.19号作业

2> 完成文本编辑器的保存工作 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFontDialog> #include <QFont> #include <QMessageBox> #include <QDebug> #include <QColorDialog> #include <QColor&g…...

Mybatis学习笔记9 动态SQL

Mybatis学习笔记8 查询返回专题_biubiubiu0706的博客-CSDN博客 动态SQL的业务场景&#xff1a; 例如 批量删除 get请求 uri?id18&id19&id20 或者post id18&id19&id20 String[] idsrequest.getParameterValues("id") 那么这句SQL是需要动态的 还…...

element表格 和后台联调

1.配置接口 projectList:/api/goods/xxx,//产品列表2.请求接口(get请求默认参数page) // 产品列表 pageprojectList(params){return axios.get(base.projectList,{params})}3.获取数据 直接放到created里边去了 刷新页面就可以看到 async projectList(page){let res await t…...

erp网站建设方案/百度广告一天多少钱

在这篇文章中&#xff0c;我们将谈谈如何在Angular JS中将XML文件转换为JSON。大家都知道Angular JS是开发应用程序的JavaScript框架。所以基本上Angular JS期望得 到的响应式JSON格式的。因此&#xff0c;在你开始对数据进行操作之前&#xff0c;建议返回JSON格式的数据。在这…...

网站推广好做吗/广州网站制作实力乐云seo

public int findTheWinner(int n, int k) {int ans0;for(int i2;i<n;i){//最后的人一定在0位置处&#xff0c;每次去掉一人&#xff0c;他的位置左移k&#xff0c;要想知道他的初始位置则要kans(ansk)%i;}return ans1;}...

app ui设计网站/免费注册网站

前端开发中&#xff0c;导入导出有很多方面比如html中导入js、css&#xff0c;es6导入导出&#xff0c;scss、less中导入外部样式。是时候一一记录平时参考。 html中导入js、css <html><head><meta charset"UTF-8"><link rel"stylesheet…...

成都网站建设 赢展/软文有哪几种类型

// int[,] label new int[m, n]; Parallel.For(0, thread_num, (n) >{for (int i switchPoint[n]; i < switchPoint[n 1]; i){int[] tmp new int[n];}}); 空间开在并行块之外远远快于开在循环块之内。不确定是否是因为线程之间的竞争~~转载于:https://www.cnblogs.co…...

百度关键词优化软件网站/seo外链优化

首先、如果是运行在internet上的系统&#xff0c;并且如果是个涉及到利益性的系统&#xff0c;不可避免的会遭受各种攻击&#xff08;我们公司的很多系统从OS到DB到webapp就实时有收到攻击和破解&#xff09;&#xff0c;所以尽可能保证安全性将不再是架构师和安全部门唯一应该…...

大连网站制作 姚喜运/视频剪辑培训班学费一般多少

凌晨四点的东方是什么样子的&#xff0c;这个世界上恐怕只有科比和加班的程序员知道。 如果不是隔壁的高楼挡住了我的视线&#xff0c;我想东方的鱼肚白一定被我尽收眼底。想想都很多年没有去亲眼看日出了&#xff0c;但j是这却是这近一年第四次通宿加班了&#xff0c;也是游戏…...