冒泡排序(Bubble Sort)
目录
- 1.冒泡排序
- 1.1 基本原理
- 1.2 例子
- 1.3 示例代码
- 2.魔炮排序
- 2.1 基本原理
- 2.1 例子
- 2.2 示例代码
1.冒泡排序
1.1 基本原理
冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。遍历数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。
冒泡排序的基本思想是:
- 比较相邻的元素。如果第一个比第二个大,就交换他们两个。
- 对每一对相邻元素做同样的工作,从开始第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。
- 针对所有的元素重复以上的步骤,除了最后一个。
- 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。
这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端,故名。
冒泡排序的时间复杂度在最坏和平均情况下都是 O(n^2),其中 n 是列表的长度。
解释如下:
- 最坏情况下,即输入数组完全逆序,需要进行 n(n-1)/2 次比较和交换,所以最坏情况下的时间复杂度是 O(n^2)。
- 平均情况下,需要进行近似 n(n-1)/4 次比较和交换,所以平均情况下的时间复杂度也是 O(n^2)。
在最好情况下,即输入数组已经完全有序,冒泡排序只需要进行 n-1 次比较,不需要进行交换,所以最好情况下的时间复杂度是 O(n)。
1.2 例子
冒泡排序的基本思想是:每次比较两个相邻的元素,如果他们的顺序(如从大到小、首字母从A到Z)错误就将他们交换过来。
举例说明,假设我们有一个待排序的数列:[5, 3, 8, 6, 1]
- 第一轮排序,从第一个元素开始,比较相邻的两个元素,如果第一个元素大于第二个元素,就交换他们。这一轮结束后,最大的元素会被放到数列的最后。数列变为:
[3, 5, 6, 1, 8] - 第二轮排序,同样从第一个元素开始,重复上述过程,但是最后一个元素(这里是8)可以忽略,因为它已经是最大的元素。数列变为:
[3, 5, 1, 6, 8] - 第三轮排序,重复上述过程,忽略最后两个元素(这里是6和8)。数列变为:
[3, 1, 5, 6, 8] - 第四轮排序,重复上述过程,忽略最后三个元素(这里是5、6和8)。数列变为:
[1, 3, 5, 6, 8]
此时,所有元素已经排序完成。
1.3 示例代码
#include <stdio.h>void bubbleSort(int arr[], int n) {int i, j, temp;for(i = 0; i < n-1; i++) { 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;}}}
}void printArray(int arr[], int size) {int i;for (i=0; i < size; i++)printf("%d ", arr[i]);printf("\n");
}int main() {int arr[] = {64, 34, 25, 12, 22, 11, 90};int n = sizeof(arr)/sizeof(arr[0]);bubbleSort(arr, n);printf("Sorted array: \n");printArray(arr, n);return 0;
}
这段代码首先定义了一个 bubbleSort 函数,用于执行冒泡排序。然后定义了一个 printArray 函数,用于打印数组。在 main 函数中,我们创建了一个数组,并调用 bubbleSort 函数对其进行排序,然后打印排序后的数组。
2.魔炮排序
2.1 基本原理
魔炮排序(Cocktail Sort)也被称为双向冒泡排序,是冒泡排序的一种变形。它在对待排序的数列进行遍历时,是双向进行的,也就是说,每一轮遍历都分为两个方向,一个是从前往后,一个是从后往前。
魔炮排序的基本思想是:
- 首先,从左到右比较相邻的元素,如果左边的元素大于右边的元素,就交换他们。这一步完成后,最大的元素会被放到数列的最右边。
- 然后,从右到左比较相邻的元素,如果右边的元素小于左边的元素,就交换他们。这一步完成后,最小的元素会被放到数列的最左边。
- 重复以上步骤,直到没有元素需要交换。
魔炮排序(Cocktail Sort)的时间复杂度和冒泡排序一样,都是 O(n^2)。
在最好的情况下,如果输入的数据已经是排序好的,那么魔炮排序只需要进行一次遍历,所以最好的情况下时间复杂度是 O(n)。
但是在最坏的情况下,例如输入的数据是逆序的,那么魔炮排序需要进行 n(n-1)/2 次比较,所以最坏的情况下时间复杂度是 O(n^2)。
平均情况下,魔炮排序的时间复杂度也是 O(n^2)。
2.1 例子
举例说明,假设我们有一个待排序的数列:[5, 1, 4, 2, 8, 0, 2]
- 第一轮从左到右的排序后,数列变为:
[1, 4, 2, 5, 0, 2, 8] - 第一轮从右到左的排序后,数列变为:
[0, 1, 2, 4, 2, 5, 8] - 第二轮从左到右的排序后,数列变为:
[0, 1, 2, 2, 4, 5, 8] - 第二轮从右到左的排序后,数列变为:
[0, 1, 2, 2, 4, 5, 8]
此时,所有元素已经排序完成。
2.2 示例代码
#include <stdio.h>void cocktailSort(int a[], int n) {int swapped = 1;int start = 0;int end = n - 1;while (swapped) {swapped = 0;for (int i = start; i < end; ++i) {if (a[i] > a[i + 1]) {int temp = a[i];a[i] = a[i + 1];a[i + 1] = temp;swapped = 1;}}if (!swapped)break;swapped = 0;--end;for (int i = end - 1; i >= start; --i) {if (a[i] > a[i + 1]) {int temp = a[i];a[i] = a[i + 1];a[i + 1] = temp;swapped = 1;}}++start;}
}void printArray(int a[], int n) {for (int i = 0; i < n; i++)printf("%d ", a[i]);printf("\n");
}int main() {int a[] = {5, 1, 4, 2, 8, 0, 2};int n = sizeof(a) / sizeof(a[0]);cocktailSort(a, n);printf("Sorted array: \n");printArray(a, n);return 0;
}
这段代码首先定义了一个 cocktailSort 函数,用于执行魔炮排序。然后定义了一个 printArray 函数,用于打印数组。在 main 函数中,我们创建了一个数组,并调用 cocktailSort 函数对其进行排序,然后打印排序后的数组。
相关文章:
冒泡排序(Bubble Sort)
目录 1.冒泡排序1.1 基本原理1.2 例子1.3 示例代码 2.魔炮排序2.1 基本原理2.1 例子2.2 示例代码 1.冒泡排序 1.1 基本原理 冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地遍历待排序的数列,一次比较两个元素,如果他们的…...
JVM源码剖析之软、弱、虚引用的处理细节
目录 写在前面: 源码剖析: Java层面: JVM层面: 使用危险点: 总结: 版本信息: jdk版本:jdk8u40 垃圾回收器:Serial new/old 写在前面: 不同的垃圾回收…...
Linux服务器上搭建JupyterNotebook教程
搭建需知 1.确保是Linux服务器; 2.已经在linux服务器上安装好anaconda3; 搭建教程 请按照顺序依次执行下面的命令: 1、安装Jupyter Notebook 执行以下命令,安装jupyter notebook conda install jupyter【注】 如果anaconda3…...
记录bug1
项目场景: 提示:这里简述项目相关背景: 例如:项目场景:示例:通过蓝牙芯片(HC-05)与手机 APP 通信,每隔 5s 传输一批传感器数据(不是很大) 问题描述 提示:这里描述项目中遇到的问题࿱…...
【MySQL】rank()、row_number()、dense_rank()用法详解
建表测试 测试表数据:test1 CREATE DATABASE /*!32312 IF NOT EXISTS*/db_test /*!40100 DEFAULT CHARACTER SET utf8 */; USE db_test; /*Table structure for table test1 */ DROP TABLE IF EXISTS test1; CREATE TABLE test1 ( id int(10) NOT NULL, score i…...
NFT合约部署
部署合约: 1.web3 NFT合约部署工具 https://remix.ethereum.org/ 2.tron NFT合约部署工具 https://www.tronide.io/ 3.部署 web3 ERC721代码: // SPDX-License-Identifier: MIT pragma solidity ^0.8.2;import "openzeppelin/contracts/token/ERC7…...
【C++】从入门到精通第三弹——友元函数与静态类成员
这里写目录标题 静态类成员友元友元方法 静态类成员 类成员一般都需要通过对象来访问,不可以通过类名直接访问,但是当我们将类成员定义为静态类成员,则允许使用类名直接访问。 静态类成员是在类成员前定义static关键字。 1 #include<iost…...
acwing算法基础之搜索与图论--floyd算法
目录 1 基础知识2 模板3 工程化 1 基础知识 floyd算法的时间复杂度为O(n^3),它用来解决多源最短路问题。它的原理是基于动态规划。 floyd算法的关键步骤: k从1到n。i从1到n。j从1到n,d[i][j] min(d[i][j], d[i][k] d[k][j])。经过上述三…...
Zabbix监控SSL证书有效期
一、介绍 由于业务需要,最近通过 Let’s Encrypt 申请了一些 SSL 证书,而证书有效期为 3 个月,需要在证书到期之前 renew。由于域名较多经常忘记 renew,导致证书过期,因此想通过 Zabbix 的方式监控证书的到期时间&…...
Arduino OneButton按键处理库实现单击/双击/长按功能
Arduino OneButton按键处理库实现单击/双击长按功能 ✨在Arduino开发平台下,按键的单击/双击/长按功能,在通过使用OneButton库,很容易就可以轻松实现。这就是支持C/C模块化设计的好处,避免重复性开发的工作。 🔖本文将…...
day52 django的下载与安装
课程的大致安排 大概两周的时间都是围绕着Django框架的学习,包括后续要学习的drf、Redis、celery、es等技术栈都是围绕Django展开的,因此、要求所有的同学必须认证学习了 市场中所有使用Python开发的web项目,Django框架占有率达到90%以上 …...
WebGL智慧城市软件项目
WebGL开发智慧城市项目时,需要考虑多个方面,包括技术、隐私、安全和可持续性。以下是一些需要注意的关键问题,希望对大家有所帮助。北京木奇移动技术有限公司,专业的软件外包开发公司,欢迎交流合作。 1.隐私和数据安全…...
VMware重装后没有虚拟网卡
我重装VMware之后网络适配器里面没有虚拟网卡,找了CSDN上很多博主说的,都没用。 最终去看了b站的up视频就成功了。 原因是因为第一次安装后卸载不干净,软件在电脑上的注册表没有删掉。 要用下面两个软件清理一下残留文件,这两个…...
软件安全基础
传参基础 64位汇编传参,当参数少于7个时, 参数从左到右放入寄存器: rdi, rsi, rdx, rcx, r8, r9。 当参数为7个以上时, 前 6 个与前面一样, 但后面的依次从 “右向左” 放入栈中,即和32位汇编一样。 我们这边要利用wr…...
探索项目管理软件的多重用途和益处
项目管理软件俨然成了当下项目管理话题中的热门词条,作为一个辅助性管理工具,项目管理软件有什么用?真的值得购入吗? 什么是项目管理软件 顾名思义,项目管理软件就是指在项目管理过程使用的各种软件工具。项目管理软件…...
Arduino ESP8266使用AliyunIoTSDK.h连接阿里云物联网平台
文章目录 1、AliyunIoTSDK简介2、相关库安装3、阿里云创建产品,订阅发布4、对开源的Arduino ESP8266源代码修改5、使用阿里云点亮一个LED灯6、设备向阿里云上传温度数据7、项目源码 1、AliyunIoTSDK简介 AliyunIoTSDK是arduino的一个库,可以在arduino的…...
【车载开发系列】AutoSar中的CANTP
【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP 【车载开发系列】AutoSar中的CANTP一. CANTP相关术语二. CANTP相关概念1)单帧:SF(Single Frame)2)首帧:FF(First Frame)3)连续帧CF(Consecutive F…...
JUL日志
文章目录 JUL日志JUL日志讲解Properties配置文件编写日志配置文件Lombok快速开启日志Mybatis日志系统 JUL日志 如果使用System.out.println来打印信息,项目中存在大量的控制台输出语句,会显得很凌乱,而且日志的粒度是不够细的,假…...
ZZ308 物联网应用与服务赛题第G套
2023年全国职业院校技能大赛 中职组 物联网应用与服务 任 务 书 (G卷) 赛位号:______________ 竞赛须知 一、注意事项 1.检查硬件设备、电脑设备是否正常。检查竞赛所需的各项设备、软件和竞赛材料等; 2.竞赛任务中所使用…...
如何使用 vcpkg 编译Google-V8脚本引擎(ECMA/JavaScript)?
WIN32K下一键杀死所有同名进程命令行:taskkill /F /IM chrome.exe ############################## 1、准备 Visual Studio 2019 2、准备 Visual Studio 2022 3、安装 VC、MSBuild 编译集成环境 4、安装 Python 3.x,早期V8发行版本编译安装 2.x 5、…...
SpringCloud进阶--Seata与分布式事务歉
起因是我想在搞一些操作windows进程的事情时,老是需要右键以管理员身份运行,感觉很麻烦。就研究了一下怎么提权,顺手瞄了一眼Windows下用户态权限分配,然后也是感谢《深入解析Windows操作系统》这本书给我偷令牌的灵感吧ÿ…...
从零打造一个丝滑的 Vue 3 返回顶部组件
从零打造一个丝滑的 Vue 3 返回顶部组件 这个组件具备以下特性: 智能显示:滚动超过指定距离(默认 300px)后自动出现。丝滑动画:使用 Vue 内置的 <Transition> 实现淡入上滑的出现 / 消失效果。平滑滚动ÿ…...
深夜告警炸裂?这份Linux故障排查“作战地图”请收好劣
先唠两句:参数就像餐厅点单 把API想象成一家餐厅的“后厨系统”。 ? 路径参数/dishes/{dish_id} -> 好比你要点“宫保鸡丁”这道具体的菜,它是菜单(资源路径)的一部分。查询参数/dishes?spicytrue&typeSichuan -> 好比…...
为什么92%的LLM项目在Q3前无法通过等保三级?2026奇点大会首次发布《LLM生产安全合规检查清单V2.1》
第一章:2026奇点智能技术大会:LLM生产环境部署指南 2026奇点智能技术大会(https://ml-summit.org) 在真实生产环境中部署大语言模型,需兼顾推理延迟、显存效率、服务可观测性与安全合规性。本次大会实践工作坊基于 Llama-3-70B-Instruct 与 …...
避坑指南:PaviaU数据集预处理中,你的标准化和样本切片方法可能都错了
高光谱数据处理进阶:PaviaU数据集预处理的三大优化策略 1. 标准化方法的深度选择:全局与逐波段的博弈 高光谱数据的标准化处理远非简单调用StandardScaler()就能解决。PaviaU数据集包含103个波段,每个波段的光谱响应特性差异显著。全局标准化…...
龙虾-OpenClaw一文详细了解-手搓OpenClaw-4.0 Tool Runtime
本文以 OpenAI 风格的工具调用举例说明“工具调用(Tool Calling)”的协议约定。 1. 核心概念 tools:你提供给模型可调用的工具列表(最常见是 function 类型)。tool_choice:控制模型是否/如何调用工具&…...
从社交网络到推荐系统:图解GNN消息传播的5个真实应用场景(含PyG核心API速查)
从社交网络到推荐系统:图解GNN消息传播的5个真实应用场景(含PyG核心API速查) 当你在社交平台看到"可能认识的人"推荐,或在电商网站收到精准的商品推荐时,背后很可能隐藏着一个强大的图神经网络(G…...
2026届毕业生推荐的五大降AI率平台解析与推荐
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek DeepSeek作为一款智能写作工具,对论文写作全过程能起到有效辅助作用,…...
rasterizeHTML.js API完全手册:从drawHTML到drawURL的完整使用指南
rasterizeHTML.js API完全手册:从drawHTML到drawURL的完整使用指南 【免费下载链接】rasterizeHTML.js Renders HTML into the browsers canvas 项目地址: https://gitcode.com/gh_mirrors/ra/rasterizeHTML.js rasterizeHTML.js是一款强大的JavaScript库&am…...
FPGA驱动RGB888屏幕实战:从时序解析到图像显示的完整流程
1. RGB888屏幕驱动基础 第一次拿到RGB888屏幕时,我盯着那密密麻麻的40针排线直发懵。这种屏幕每个像素点需要24位数据(R/G/B各8位),比常见的RGB565模式色彩细腻得多,但驱动复杂度也直线上升。就像装修房子,…...
