冒泡排序基础与实现

devtools/2025/1/13 10:09:57/

目录

1. 原理图

​编辑

2. 什么是冒泡排序

3. 工作原理

3.1 具体步骤

3.2 时间复杂度

 3.3 空间复杂度

4. 代码实现

 5. 总结


1. 原理图

2. 什么是冒泡排序

冒泡排序(Bubble Sort)是一种简单的排序算法,它通过重复地遍历要排序的列表,比较相邻元素并根据需要交换它们的位置来工作。这个过程会持续进行,直到整个列表变得有序为止。由于其简单性,冒泡排序常用于教学目的,但它并不是最高效的排序算法,特别是在处理大数据集时。

3. 工作原理

冒泡排序的基本思想是重复地访问要排序的列表,一次比较两个元素,如果它们的顺序错误就交换它们的位置。每次遍历后,最大的未排序元素会被移动到列表的末尾,就像气泡逐渐浮到水面上一样,因此得名“冒泡排序”。

3.1 具体步骤

(1) 比较相邻的元素。如果前一个比后一个大,则交换它们。

(2) 对每一对相邻元素做同样的工作,从开始的第一对到结尾的最后一对。这步做完后,最后的元素会是最大的数。

(3) 针对所有的元素重复以上的步骤,除了最后一个。

(4) 持续每次对越来越少的元素重复上面的步骤,直到没有任何一对数字需要比较。

3.2 时间复杂度

(1) 最坏情况:O(n²),当输入数组完全逆序时,每次遍历都需要进行 n-1 次比较和可能的交换。

(2) 最好情况:O(n),如果输入数组已经是排序好的,那么只需要一次遍历即可完成排序。

(3) 平均情况:O(n²),这是因为它依赖于数据的初始状态。

 3.3 空间复杂度

O(1),因为这是一个原地排序算法,不需要额外的空间来存储数据。

4. 代码实现

下面是用 JavaScript 实现的冒泡排序算法。这个实现不仅包含了基本的排序逻辑,还加入了一个优化:如果在某一轮遍历中没有发生任何交换,就认为数组已经有序,从而提前终止排序过程。

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Bubble Sort Example</title>
</head>
<body><h1>JavaScript 冒泡排序示例</h1><button onclick="runBubbleSort()">运行冒泡排序</button><p id="result"></p><script>function bubbleSort(arr) {let n = arr.length;let swapped;for (let i = 0; i < n - 1; i++) {swapped = false;// 内层循环控制相邻元素之间的比较for (let j = 0; j < n - 1 - i; j++) {if (arr[j] > arr[j + 1]) {// 交换元素[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];swapped = true;}}// 如果没有发生交换,说明数组已经有序,可以提前退出if (!swapped) break;}return arr;}function runBubbleSort() {// 示例数组const exampleArray = [64, 34, 25, 12, 22, 11, 90];// 执行冒泡排序const sortedArray = bubbleSort([...exampleArray]); // 使用扩展运算符创建副本以保持原数组不变// 显示结果document.getElementById('result').textContent = `原始数组: ${exampleArray}\n排序后的数组: ${sortedArray}`;}</script>
</body>
</html>

 5. 总结

当用户点击“运行冒泡排序”按钮时,会调用 bubbleSort 函数,执行冒泡排序,并将排序前后的数组显示在页面上的 <p> 元素内。以上就是所有内容。


http://www.ppmy.cn/devtools/150124.html

相关文章

vue elementui 大文件进度条下载

下载进度条 <el-card class"box-card" v-if"downloadProgress > 0"><div>正在下载文件...</div><el-progress :text-inside"true" :stroke-width"26" :percentage"downloadProgress" status"…

51单片机——定时器中断(重点)

STC89C5X含有3个定时器&#xff1a;定时器0、定时器1、定时器2 注意&#xff1a;51系列单片机一定有基本的2个定时器&#xff08;定时器0和定时器1&#xff09;&#xff0c;但不全有3个中断&#xff0c;需要查看芯片手册&#xff0c;通常我们使用的是基本的2个定时器&#xff…

ubuntu设置开机无需输入密码自启动todesk,内网穿透natapp

设置todesk自启动 1、完善rc-local.service服务 sudo vim /lib/systemd/system/rc-local.service 写入以下内容 # SPDX-License-Identifier: LGPL-2.1-or-later # # This file is part of systemd. # # systemd is free software; you can redistribute it and/or modif…

2025华数杯国际赛A题完整论文讲解(含每一问python代码+数据+可视化图)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025“华数杯”国际大学生数学建模竞赛A题Can He Swim Faster的完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文…

VSCode 更好用的设置

配置 {"terminal.integrated.fontSize": 15,"security.workspace.trust.untrustedFiles": "open","editor.minimap.enabled": false,"workbench.colorTheme": "Visual Studio 2017 Light - C","gnuGlobal.c…

STM32如何测量运行的时钟频率

前言 环境&#xff1a; 芯片&#xff1a;STM32F103C8T6 Keil&#xff1a;V5.24.2.0 一、简介STM32F103C8T6的时钟源 ①HSI 内部高速时钟,RC振荡器&#xff0c;频率为8MHz&#xff0c;精度不高。②HSE 外部高速时钟,可接石英/陶瓷谐振器&#xff0c;频率范围为4MHz~16MHz&…

探索 Oracle 数据库:核心概念与实践指南

Oracle 数据库是业界领先的关系型数据库管理系统 (RDBMS)&#xff0c;广泛应用于企业级应用和大型数据处理。本文将深入探讨 Oracle 数据库的核心概念、常用功能以及最佳实践&#xff0c;帮助你更好地理解和使用 Oracle 数据库。 1. Oracle 数据库的核心概念 1.1 体系结构 O…

C++ Primer Notes(3): 哪些人可以看C++ Primer

在知乎搜索 “C Primer”&#xff0c;靠前的一个问答是 「C Primer 是每位C coder心中的圣经吗&#xff1f;」。 本篇挑选一些观点&#xff0c;予以批评。 错误观点1&#xff1a;此书没有一句讲程序怎么跑起来 书中没讲程序怎么跑起来&#xff0c; 怎么使用 IDE &#xff0c; …