【数据结构】冒泡排序

冒泡排序是一种简单的排序算法。

它基于重复地交换相邻元素的位置。算法的每一步都会比较相邻的两个元素,如果它们的顺序错误(即第一个元素比第二个元素大),则交换它们。这样,每经过一轮比较和交换,数组中最大的元素就会“冒泡”到数组的最后位置。这个过程重复进行,每次循环时排除已经排序好的最大元素,直到整个数组排序完成。

以下是冒泡排序的基本步骤:

  1. 比较相邻的元素:从数组的第一个元素开始,比较相邻的两个元素的大小。
  2. 交换元素:如果第一个元素比第二个元素大,则交换它们的位置。
  3. 对下一个元素重复上述步骤:对数组中的每一对相邻元素做同样的工作,从开始的第一对到结尾的最后一对。这样,在第一轮结束后,最大的元素就位于数组的最后一个位置。
  4. 重复步骤1-3:对数组的前 n-1 个元素重复上述步骤,因为最后一个元素已经是最大的了。每轮结束后,最大的元素都会“冒泡”到它应该在的位置。
  5. 持续排序:持续进行上述过程,每次循环时减少要比较的元素数量(因为每轮都会有一个元素被放到正确的位置),直到没有任何一对元素需要交换,这时数组就完全排序好了。

冒泡排序的平均和最坏时间复杂度都是 O(n^2),其中 n 是数组的长度。这是因为它需要比较所有相邻元素对,并且在最坏的情况下,每个元素都需要移动到数组的另一端。不过,冒泡排序有一个优点,就是它是稳定的排序算法,即相等的元素在排序后保持它们的原始顺序。此外,如果在一轮比较中没有发生任何交换,冒泡排序可以提前终止,这提供了一种优化手段。

示例代码:使用 C 语言实现的冒泡排序算法.

#include <stdio.h>void bubbleSort(int arr[], int n) {int i, j, temp;for (i = 0; i < n - 1; i++) {// 设置一个标记,用于优化(如果在一次内循环中没有发生交换,说明已经排序完成)int swapped = 0;for (j = 0; j < n - i - 1; j++) {if (arr[j] > arr[j + 1]) {// 交换 arr[j] 和 arr[j + 1]temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;swapped = 1;}}// 如果内循环中没有发生交换,说明数组已经排序完成if (swapped == 0) {break;}}
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr) / sizeof(arr[0]);printf("原数组:\n");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");bubbleSort(arr, n);printf("排序后数组:\n");for (int i = 0; i < n; i++) {printf("%d ", arr[i]);}printf("\n");return 0;
}

这段代码定义了一个 bubbleSort 函数,它接受一个整数数组和数组的长度。然后,它使用冒泡排序算法对数组进行排序。在 main 函数中,我们定义了一个示例数组,调用 bubbleSort 函数对其进行排序,并打印排序前后的数组。

运行这段代码,你将看到以下输出:

原数组:
64 34 25 12 22 11 90
排序后数组:
11 12 22 25 34 64 90

以上就是冒泡排序的基本使用方法,本次代码分享到此结束,后续还会分享数据结构与算法有关代码。最后的最后,还请大家点点赞,点点关注,谢谢大家!

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

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

相关文章

ElasticSearch虚拟机安装(单机版)

1.下载7.10.2 下载链接&#xff0c;选择LINUX X86_64下载 2.创建用户 useradd es也可以使用系统默认用户&#xff08;非root&#xff09;,root用户会报错 3.解压 tar xvf elasticsearch-7.10.2-linux-x86_64.tar.gz假定目录在/home/es/elasticsearch-7.10.2-linux-x86_64 …

Spring Boot | Spring Boot 默认 “缓存管理“ 、Spring Boot “缓存注解“ 介绍

目录: 一、Spring Boot 默认 "缓存" 管理 :1.1 基础环境搭建① 准备数据② 创建项目③ 编写 "数据库表" 对应的 "实体类"④ 编写 "操作数据库" 的 Repository接口文件⑤ 编写 "业务操作列" Service文件⑥ 编写 "applic…

JavaCard学习笔记: CAP Component 之 Class Component

文章目录 整体结构tag和size字段signature_pool_length和signature_pooltype_descriptor结构导入类型编码导入项签名示例导入类导入数组导入远程方法 interfaces[]interface_info结构flagsinteface_countsuperinterfacesinterface_name class_info_compact classes[]结构flagsi…

稀碎从零算法笔记Day55-LeetCode:100291. 统计特殊字母的数量 II

今天可惜了&#xff0c;周赛第二题没看出来&#xff0c;导致第三题时间都不够&#xff0c;最后一题... 题目描述&#xff1a; 给你一个字符串 word。如果 word 中同时出现某个字母 c 的小写形式和大写形式&#xff0c;并且 每个 小写形式的 c 都出现在第一个大写形式的 c 之前…

基于Springboot的网上商城购物系统

基于SpringbootVue的网上商城购物系统的设计与实现 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatis工具&#xff1a;IDEA、Maven、Navicat 系统展示 用户登录 首页 商品信息 商品资讯 后台登录页面 后台管理首页 用户管理 商品分类管…

JAVA 整合 亚马逊AWS S3(文件上传,文件下载等)

JAVA 整合 亚马逊AWS S3(文件上传,文件下载) 1.添加依赖 因为aws需要发送请求上传、下载等api,所以需要加上httpclient相关的依赖 <dependency><groupId>software.amazon.awssdk</groupId><artifactId>s3</artifactId><version>1.12…

记录一个hive中跑insert语句说没创建spark客户端的问题

【背景说明】 我目前搭建离线数仓&#xff0c;并将hive的执行引擎改成了Spark&#xff0c;在将ods层的数据装载到dim层&#xff0c;执行insert语句时报如下错误 【报错】 [42000][40000] Error while compiling statement: FAILED: SemanticException Failed to get a spark…

星链全解1

星链基本信息 星链卫星的寿命约为5年&#xff0c;最终目标是发射42000颗卫星。最初&#xff0c;每颗卫星重约260公斤&#xff0c;与1吨以上的大卫星相比属于“小卫星”。现在&#xff0c;向V2版进化的星链卫星重量近800公斤&#xff0c;约为老一代卫星的3倍。 点击“星链地图…

【Entity Framework】聊一聊EF如何使用数据库函数

【Entity Framework】聊一聊EF如何使用数据库函数 文章目录 【Entity Framework】聊一聊EF如何使用数据库函数一、数据库函数的类型二、内置函数与用户定义的函数四、聚合函数、标量函数和表值函数五、Niladic函数六、EF Core 中的数据库函数映射6.1 内置函数映射6.2 EF.Functi…

Redis入门到通关之数据结构解析-QuickList

文章目录 ☃️前提概要☃️ 配置项相关☃️简要源码☃️总结 Redis中的 QuickList 是一种特殊的数据结构&#xff0c;用于存储列表类型的数据。它的设计目的是在内存中高效地存储和操作大量的列表元素&#xff0c;尤其是当列表长度很大时。 QuickList的内部结构是一个由多个节…

ARM与单片机有啥区别?

初学者必知&#xff1a;ARM与单片机到底有啥区别&#xff1f;1、软件方面这应该是最大的区别了。引入了操作系统。为什么引入操作系统&#xff1f;有什么好处嘛&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「ARM的资料从专业入门到高级教…

完全日期(蓝桥杯)

文章目录 完全日期题目描述模拟 完全日期 题目描述 本题为填空题&#xff0c;只需要算出结果后&#xff0c;在代码中使用输出语句将所填结果输出即可。 如果一个日期中年月日的各位数字之和是完全平方数&#xff0c;则称为一个完全日期。 例如&#xff1a;2021 年 6 月 5 日…

Z变换和离散傅里叶变换区别

Z变换和离散傅里叶变换&#xff08;DFT&#xff09;都是数字信号处理中的重要工具&#xff0c;它们之间有几个关键的区别&#xff1a; 定义域&#xff1a; Z变换是在整个Z平面上定义的&#xff0c;可以处理信号的整个频率范围。 DFT仅在单位圆上定义&#xff0c;对应于周期信号…

【Linux驱动层】iTOP-RK3568学习之路(二):vscode中设置头文件路径-完成代码自动补全

在Ubuntu下用vscode写Linux驱动层的时候&#xff0c;需要添加头文件&#xff1a; #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h>但vscode没有智能提示&#xff0c;因此需要我们手动添加自己的头文件路径&#xff1a; topeetu…

嵌入式Linux开发实操(十七):Linux Media Infrastructure userspace API

视频和无线电流媒体设备使用的Linux内核到用户空间API,包括摄像机、模拟和数字电视接收卡、AM/FM接收卡、软件定义无线电(SDR)、流捕获和输出设备、编解码器设备和遥控器。典型的媒体设备硬件如下: 媒体基础设施API就是用于控制此类设备的,分五个部分。 第一部分V4L2 API…

设计模式学习笔记 - 开源实战三(下):借助Google Guava学习三大编程范式中的函数式编程

概述 现在主流的编程范式主要有三种&#xff0c;面向过程、面向对象和函数式编程。在理论部分&#xff0c;已经介绍了前面两种编程范式。本章再讲讲剩下的编程范式&#xff0c;函数式编程。 函数式编程并非是一个很新的东西&#xff0c;早在 50 年前就已经出现。近几年&#…

全量知识系统 程序详细设计 之“因果关系模型”(QA百度搜索)

Q1. 今天聊聊全量知识系统&#xff08;简称“全知系统”&#xff09;中 对“因果”的理解。&#xff08;地位、意义和作用&#xff09; 在全量知识系统&#xff08;全知系统&#xff09;中&#xff0c;“因果”的理解占据着核心地位&#xff0c;其意义和作用不容忽视。以下是对…

AI安全之问:我们的智能助手真的安全吗?

在我们日益依赖人工智能来撰写文档、编写程序代码、甚至创作艺术作品的今天&#xff0c;我们是否曾经想过这些智能系统可能面临的被恶意操纵的风险&#xff1f; 分享几个网站 GPT-3.5研究测试&#xff1a; https://hujiaoai.cn GPT-4研究测试&#xff1a; https://higpt4.cn…

MKS 质量MFC流量控制器原理及应用课件PPT

MKS 质量MFC流量控制器原理及应用课件PPT

Git | Git基本命令

Git | Git基本操作 文章目录 Git | Git基本操作一、创建Git本地仓库1、创建Git仓库2、配置Git3、理解工作区、暂存区、版本库关系 二、添加、修改与查看添加文件查看历史提交记录 修改文件查看.git文件 三、版本回退版本回退撤销修改尚未add已add但还未commit已add并commit 删除…