11.3 冒泡排序

server/2024/10/11 9:22:58/

目录

11.3   冒泡排序

11.3.1   算法流程

11.3.2   效率优化

11.3.3   算法特性


11.3   冒泡排序

冒泡排序(bubble sort)通过连续地比较与交换相邻元素实现排序。这个过程就像气泡从底部升到顶部一样,因此得名冒泡排序。

如图 11-4 所示,冒泡过程可以利用元素交换操作来模拟:从数组最左端开始向右遍历,依次比较相邻元素大小,如果“左元素 > 右元素”就交换二者。遍历完成后,最大的元素会被移动到数组的最右端。

bubble_operation_step7

图 11-4   利用元素交换操作模拟冒泡

11.3.1   算法流程

设数组的长度为 𝑛 ,冒泡排序的步骤如图 11-5 所示。

  1. 首先,对 𝑛 个元素执行“冒泡”,将数组的最大元素交换至正确位置
  2. 接下来,对剩余 𝑛−1 个元素执行“冒泡”,将第二大元素交换至正确位置
  3. 以此类推,经过 𝑛−1 轮“冒泡”后,前 𝑛−1 大的元素都被交换至正确位置
  4. 仅剩的一个元素必定是最小元素,无须排序,因此数组排序完成。

冒泡排序流程

图 11-5   冒泡排序流程

示例代码如下:

bubble_sort.c

/* 冒泡排序 */
void bubbleSort(int nums[], int size) {// 外循环:未排序区间为 [0, i]for (int i = size - 1; i > 0; i--) {// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;}}}
}

11.3.2   效率优化

我们发现,如果某轮“冒泡”中没有执行任何交换操作,说明数组已经完成排序,可直接返回结果。因此,可以增加一个标志位 flag 来监测这种情况,一旦出现就立即返回。

经过优化,冒泡排序的最差时间复杂度和平均时间复杂度仍为 𝑂(𝑛2) ;但当输入数组完全有序时,可达到最佳时间复杂度 𝑂(𝑛) 。

bubble_sort.c

/* 冒泡排序(标志优化)*/
void bubbleSortWithFlag(int nums[], int size) {// 外循环:未排序区间为 [0, i]for (int i = size - 1; i > 0; i--) {bool flag = false;// 内循环:将未排序区间 [0, i] 中的最大元素交换至该区间的最右端for (int j = 0; j < i; j++) {if (nums[j] > nums[j + 1]) {int temp = nums[j];nums[j] = nums[j + 1];nums[j + 1] = temp;flag = true;}}if (!flag)break;}
}

11.3.3   算法特性

  • 时间复杂度为 𝑂(𝑛2)、自适应排序:各轮“冒泡”遍历的数组长度依次为 𝑛−1、𝑛−2、…、2、1 ,总和为 (𝑛−1)𝑛/2 。在引入 flag 优化后,最佳时间复杂度可达到 𝑂(𝑛) 。
  • 空间复杂度为 𝑂(1)、原地排序:指针 𝑖 和 𝑗 使用常数大小的额外空间。
  • 稳定排序:由于在“冒泡”中遇到相等元素不交换。

http://www.ppmy.cn/server/46563.html

相关文章

Spring系统学习 - Spring入门

什么是Spring&#xff1f; Spring翻译过来就是春天的意思&#xff0c;字面意思&#xff0c;冠以Spring的意思就是想表示使用这个框架&#xff0c;代表程序员的春天来了&#xff0c;实际上就是让开发更加简单方便&#xff0c;实际上Spring确实做到了。 官网地址&#xff1a;ht…

LabVIEW在高校电力电子实验中的应用

概述&#xff1a;本文介绍了如何利用LabVIEW优化高校电力电子实验&#xff0c;通过图形化编程实现参数调节、实时数据监控与存储&#xff0c;并与Simulink联动&#xff0c;提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时&#xff0c;通常使用…

基于Springboot驾校预约平台小程序的设计与实现(源码+数据库+文档)

一.项目介绍 系统角色&#xff1a;管理员、教练、学员 小程序(仅限于学员注册、登录)&#xff1a; 查看管理员发布的公告信息 查看管理员发布的驾校信息 查看所有教练信息、预约(需教练审核)、评论、收藏喜欢的教练 查看管理员发布的考试信息、预约考试(需管理…

Python——cv2 判断图像读取内容是否为空

import cv2 pic_path"xxx.jpg" imagecv2.imread(pic_path) if None image:print("图片为空") else:print("图片不为空")

EureKa是什么?

Eureka 是一个源于 Netflix 公司的开源项目&#xff0c;主要用于实现服务注册和服务发现的功能。它是构建分布式系统中的微服务架构的一个关键组件。下面是对 Eureka 的解释&#xff1a; 基本概念 Eureka 是基于 REST 的服务&#xff0c;主要用于管理微服务架构中的服务实例的…

GPT-4o:人工智能的新篇章

GPT-4o&#xff1a;人工智能的新篇章 简介 人工智能领域不断进步&#xff0c;GPT系列作为其中的佼佼者&#xff0c;其最新版本GPT-4o的推出引起了广泛关注。本文将对GPT-4o进行评价&#xff0c;从版本对比、技术能力到个人感受&#xff0c;全方位探讨这一革命性的语言模型。 …

微信小程序对接发货功能

注&#xff1a;微信小程序对接发货功能 文档地址&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/platform-capabilities/business-capabilities/order-shipping/order-shipping.html php代码 common.php use think\Config; use think\Db; use fast\Http; us…

FreeRTOS学习笔记【1】

本文章为本人学习FreeRTOS时的笔记&#xff0c;学习时使用 STM32 SPL库Keil开发环境。 之前发过这篇文章但不知为何在CSDN上MD格式无法显示&#xff0c;故重新发一次。(真不是水浏览量) 文章目录 操作系统启动步骤1.定义任务函数2.空闲任务与定时器任务堆栈函数实现3.定义任务…