【最基础最直观的排序 —— 冒泡排序算法】

最基础最直观的排序 —— 冒泡排序算法

冒泡排序(Bubble Sort)是一种计算机科学领域的较简单的排序算法,属于交换排序。其基本思想是在待排序的一组数中,将相邻的两个数进行比较,若前面的数比后面的数大就交换两数,否则不交换;如此下去,直至最终完成排序。

在冒泡排序中以升序为例,算法将待排序的 n 个数中相邻两个数进行比较,将较大的数交换到后面的一个位置上。重复这一操作,直到处理完本轮数列中最后两个元素,称为一轮排序。
当一轮排序完成时,最大的数就被轮换到本轮排序数列最右端位置上。重复上面的过程,经过 n - 1 轮后,就实现了数据升序排序。冒泡排序是一种稳定排序算法,即如果两个元素相等,是不会再交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换,所以相同元素的前后顺序并没有改变。
在这里插入图片描述

以下是各种语言的冒泡排序代码示例:

  • C 语言:
void bubble_sort(int* src,int length)//整数数组的排序
{int i =0,j = 0;int tmp = 0;/* 入参检查 */if(NULL == src || length <=0){printf("(Error):Func:%s input...");}for (i = 0; i < length - 1; i++){for (j = 0; j < length - i - 1; j++){if(src[j]>src[j+1]){tmp = src[j];src[j] = src[j+1];src[j+1] = tmp;}}}
}
  • JavaScript:
//冒泡排序的排序过程是简单直观的,主要的执行步骤:
//1. 比较未排序序列中的相邻元素,如果两者的顺序不正确,则对两个元素进行交换;
//2. 重复地对剩余未排序的元素执行上一步,直至完成排序;
var bubbleSort = function (nums) {const n = nums.length;// 控制执行轮数for (let i = 0; i < n - 1; i++) {// 当次的所...for (let j = 0; j < n - i - 1; j++) {if (nums[j]> nums[j + 1]) {// 交换相邻元素的位置let temp = nums[j];nums[j]= nums[j + 1];nums[j + 1]= temp;}}}return nums;
}
  • Java:
public class BubbleSort{public static void bubbleSort(int[] array){int n = array.length;for(int i =0; i < n -1; i++){for(int j =0; j < n - i -1; j++){if(array[j]> array[j +1]){// 交换相邻元素的位置int temp = array[j];array[j]= array[j +1];array[j +1]= temp;}}}}public static void main(String[] args){int[] array ={64,34,25,12,22,11,90};bubbleSort(array);System.out.println("排序后的数组:");for(int i : array){System.out.print(i +" ");}}
}

综上所述,冒泡排序算法虽然简单,但在一些小规模数据的排序场景中仍然有其应用价值。

冒泡排序算法的基本思想

冒泡排序是一种简单的排序算法,其基本思想是重复地走访要排序的数列,一次比较两个相邻的元素,如果它们的顺序错误就把它们交换过来。具体来说,从数列的第一个元素开始,依次比较相邻的两个元素,若前面的元素比后面的元素大,则交换它们的位置。这样一轮比较下来,最大的元素就会“冒泡”到数列的末尾。接着,对剩余的未排序部分重复上述过程,直到整个数列都有序为止。

例如,对于数列[5, 3, 8, 2, 7],首先比较5和3,因为5大于3,所以交换它们的位置,数列变为[3, 5, 8, 2, 7]。接着比较5和8,不交换,再比较8和2,交换位置,数列变为[3, 5, 2, 8, 7]。最后比较8和7,交换位置,第一轮结束后数列变为[3, 5, 2, 7, 8]。然后对[3, 5, 2, 7]进行第二轮比较,以此类推,直到整个数列有序。

冒泡排序的优点是实现简单,容易理解,对于小规模数据的排序比较方便。但其缺点也很明显,时间复杂度较高,在最坏情况下,即待排序的元素已经按照逆序排列时,需要进行 n - 1 轮比较和交换操作,每轮需要进行 n - i 次比较和交换操作,其中 n 是待排序数组的元素数量,i 是当前轮数。因此,最坏情况下的时间复杂度为 O(n²)。

冒泡排序算法的稳定性

冒泡排序是一种稳定的排序算法。所谓稳定性,是指在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变。

在冒泡排序中,如果两个元素相等,是不会进行交换的;如果两个相等的元素没有相邻,那么即使通过前面的两两交换把两个相邻起来,这时候也不会交换。所以相同元素的前后顺序并没有改变,这就保证了冒泡排序的稳定性。

例如,对于数列[5, 3, 5’, 2, 7],其中5’表示另一个值为5的元素。在冒泡排序过程中,当比较到5和5’时,由于它们相等,不会进行交换。这样,在排序后的数列中,5和5’的相对位置与原数列保持一致。

冒泡排序算法的时间复杂度

冒泡排序的时间复杂度在最坏情况下为 O(n²),其中 n 为待排序的元素个数。在最坏情况下,即待排序的元素已经按照逆序排列,需要进行 n - 1 轮比较和交换操作,每轮需要进行 n - i 次比较和交换操作,因此总的时间复杂度为 O(n²)。

在最好情况下,即已经排好序的数组,时间复杂度为 O(n),因为只需要进行一轮比较就可以确定已经排好序。

平均情况下,时间复杂度也为 O(n²),因为平均需要进行 n/2 轮比较,每轮比较需要进行 n/2 次交换。

例如,对于一个包含 10 个元素的数组,在最坏情况下,第一轮需要比较 9 次,第二轮需要比较 8 次……以此类推,总共需要比较的次数为 9 + 8 + 7 + 6 + 5 + 4 + 3 + 2 + 1 = 45 次,接近 n²/2 的值。

冒泡排序算法的应用场景

冒泡排序适用于一些特定的场景:

  1. 数据规模较小:当数据规模较小时,冒泡排序的运行时间可能与其他更快的排序算法相差无几,或者甚至更快。例如,对包含几十个元素的数组进行排序。
  2. 数据已经接近有序:如果待排序的数据已经基本有序,冒泡排序的时间复杂度可以降低到 O(n)。比如,在一些数据处理过程中,已经经过了初步的整理,数据大部分已经有序,此时使用冒泡排序可以快速完成排序。
  3. 内存限制:冒泡排序是一种原地排序算法,它只需要在原始数组上进行交换操作,因此不需要额外的内存空间。这在内存受限的情况下可能会是一个优点。

但是,在大多数情况下,对于大规模数据集,更高效的排序算法如快速排序、归并排序等可能更适合使用。

C 语言冒泡排序代码示例

以下是用 C 语言实现冒泡排序的代码示例:

void bubble_sort(int arr[], int len) {int i, j, temp;for (i = 0; i < len - 1; i++) {for (j = 0; j < len - i - 1; j++) {if (arr[j] > arr[j + 1]) {temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}
}

这段代码中,外层循环控制排序的轮数,内层循环对未排序的部分进行相邻元素的比较和交换。如果前面的元素大于后面的元素,就交换它们的位置,使较大的元素“冒泡”到后面。

JavaScript 冒泡排序代码示例

以下是用 JavaScript 实现的冒泡排序代码示例:

function bubbleSort(arr) {for (let i = 0; i < arr.length; i++) {for (let j = 0; j < arr.length - i - 1; j++) {if (arr[j] > arr[j + 1]) {let temp = arr[j];arr[j] = arr[j + 1];arr[j + 1] = temp;}}}return arr;
}

这段代码中,外层循环控制趟数,里层循环控制每一趟的循环次数。通过比较相邻的两个元素,如果顺序错误就进行交换,最终实现数组的排序。

Java 冒泡排序代码示例

以下是用 Java 实现的冒泡排序代码示例:

public class BubbleSort {public static void bubbleSort(int[] array) {int n = array.length;boolean swapped;for (int i = 0; i < n - 1; i++) {swapped = false;for (int j = 0; j < n - 1 - i; j++) {if (array[j] > array[j + 1]) {int temp = array[j];array[j] = array[j + 1];array[j + 1] = temp;swapped = true;}}if (!swapped) {break;}}}
}

这段代码中,外层循环控制趟数,通过设置一个标志位 swapped,如果在一趟排序中没有发生交换,说明数组已经有序,可以提前退出循环,提高效率。

总结

冒泡排序算法虽然简单易懂,但时间复杂度较高,适用于数据规模较小、数据接近有序或内存受限的场景。在实际应用中,应根据具体情况选择合适的排序算法。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】继承(上)

个人主页~ 继承 一、继承的概念以及定义1、继承的概念2、继承的定义&#xff08;1&#xff09;定义格式&#xff08;2&#xff09;继承基类成员访问方式的变化 二、基类和派生类对象赋值转换三、继承中的作用域 一、继承的概念以及定义 1、继承的概念 继承机制是面向对象程序…

Java集合(Map篇)

一.Map a.使用Map i.键值&#xff08;key-value&#xff09;映射表的数据结构&#xff0c;能高效通过key快速查找value&#xff08;元素&#xff09;。 ii.Map是一个接口&#xff0c;最常用的实现类是HashMap。 iii.重复放入k-v不会有问题&#xff0c;但是一个…

周邦彦,北宋文坛的独特乐章

周邦彦&#xff0c;字美成&#xff0c;号清真居士&#xff0c;生于北宋仁宗嘉祐元年&#xff08;公元1056年&#xff09;&#xff0c;卒于北宋徽宗宣和三年&#xff08;公元1121年&#xff09;&#xff0c;享年65岁。他是宋代“婉约派”词人的代表之一&#xff0c;与柳永、晏几…

java日志框架之Log4j

文章目录 一、Log4j简介二、Log4j组件介绍1、Loggers (日志记录器)2、Appenders&#xff08;输出控制器&#xff09;3、Layout&#xff08;日志格式化器&#xff09; 三、Log4j快速入门四、Log4j自定义配置文件输出日志1、输出到控制台2、输出到文件3、输出到数据库 五、Log4j自…

comp 9517 Computer Vision week1

本篇博文为课堂笔记&#xff0c;因为英语不好现在不得不课下看录像复习一遍 颜色模型 RGBHSVYCbCrL\*a\*b RGB 有红、绿、蓝三通道 problem&#xff1a;不同通道之间高度相关&#xff0c;包含同种信息 如果想要紧凑的(as compactly as possible)存储图像RGB不合适&#xff0c;…

[DRAM Test]内存测试维修工具大全

目录 1、《HCI MemTest, RunMemtestPro》 2、《MEMTEST64》 3、AIDA64稳定性测试 4、《MEMTEST86》与《MEMTEST86》 5、Windows Memory Diagnostic Tool(微软内存诊断工具) 6、《RAM STRESS TEST》 7、《AMT64和AMT128》 8、《DocMemory》 9、《RAMFIX V110516B》 10…

word如何快速打开文档中的网址超链接?

1、鼠标放在文档中超链接上&#xff1a; 2、然后左手按住【CTRL】键&#xff0c;之后鼠标光标会变成一个手形&#xff0c; 然后右手&#xff0c;点击鼠标左键&#xff0c;即可快速使用电脑当前设置的默认浏览器打开并跳转到网址&#xff1a;

力扣反转链表系列【25. K 个一组翻转链表】——由易到难,一次刷通!!!

力扣《反转链表》系列文章目录 刷题次序&#xff0c;由易到难&#xff0c;一次刷通&#xff01;&#xff01;&#xff01; 题目题解206. 反转链表反转链表的全部 题解192. 反转链表 II反转链表的指定段 题解224. 两两交换链表中的节点两个一组反转链表 题解325. K 个一组翻转…

回溯算法(递归+回退)——1基础理论

文章目录 一、概念二、算法原理三、代码模板四、例题实现1、参数确定2、确定终止条件3、for循环的构建4、AC代码JavaC 5、剪枝优化理论&#xff1a;代码编写方式&#xff1a;JavaC 一、概念 回溯算法&#xff08;BackTracking&#xff09;一种通过递归&#xff0c;实现暴力枚举…

Python | Leetcode Python题解之第429题N叉树的层序遍历

题目&#xff1a; 题解&#xff1a; class Solution:def levelOrder(self, root: Node) -> List[List[int]]:if not root:return []ans list()q deque([root])while q:cnt len(q)level list()for _ in range(cnt):cur q.popleft()level.append(cur.val)for child in c…

【数据结构与算法】LeetCode:二分查找

文章目录 二分查找二分查找搜索插入位置 &#xff08;Hot 100&#xff09;x 的平方根搜索二维矩阵&#xff08;Hot 100&#xff09;在排序数组中查找元素的第一个和最后一个位置 &#xff08;Hot 100&#xff09;搜索旋转排序数组 &#xff08;Hot 100&#xff09;寻找旋转排序…

postman工具

postman是什么接口工具。接口是什么api&#xff08;俗称应用编程接口&#xff0c;简称接口&#xff09;&#xff1b;也就是程序&#xff08;服务端程序&#xff09;与程序&#xff08;客户端程序&#xff09;之间的通信方式。例如模仿服务端发送请求到客户端例如模仿客户端发送…

情指行一体化平台建设方案和必要性-———未来之窗行业应用跨平台架构

一、平台建设必要性 以下是情指行一体化平台搭建的一些必要性&#xff1a; 1. 提高响应速度 - 实现情报、指挥和行动的快速协同&#xff0c;大大缩短从信息获取到决策执行的时间&#xff0c;提高对紧急情况和突发事件的响应效率。 2. 优化资源配置 - 整合各类资源信…

没有 Microsoft Wi-Fi Direct Virtual Adapter #2 导致无法打开热点

我的环境 电脑打不开热点 系统 win11 64位 品牌 hp 笔记本电脑 解决方法&#xff1a; https://answers.microsoft.com/zh-hans/windows/forum/all/%E7%A7%BB%E5%8A%A8%E7%83%AD%E7%82%B9%E6%97%A0/9285620a-71d9-4671-b125-4cd607b6371a 解决 &#x1f613; 扫描一下设…

Codeforces Round 969 (Div. 1) C. Eri and Expanded Sets(线段树维护差分数组gcd+双指针+尺取)

题目 转化一下题意就是&#xff0c; 给定一个n(n<4e5)&#xff0c;代表数组a的长度&#xff0c; 求有多少区间&#xff0c;满足区间内两两差分后得到的新数组的gcd∈{0,1} 实际t(t<1e4)组样例&#xff0c;保证sumn不超过4e5 思路来源 乱搞acjiangly代码 题解 一个…

摆脱困境并在 Android 手机上取回删除照片的所有解决方案

没有什么比不小心从 Android 智能手机中删除所有照片更糟糕的了。这样&#xff0c;除非您在重置之前已经备份了数据&#xff0c;否则您的所有照片都会消失。如果您忘记备份照片&#xff0c;您仍然可以按照一些简单的技术在 Android 设备上恢复已删除的照片。 您的 Android 智能…

【漏洞复现】用友 NC-Cloud queryStaffByName Sql注入漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

VMware安装ubuntu24.04桌面版

一、安装推荐要求 双核2 GHz处理器或更高 4 GB系统内存 25 GB磁盘存储空间 可访问的互联网 光驱或USB安装介质 二、下载桌面系统 下载地址&#xff08;使用手机转存再下载是对作者的最大支持&#xff09;&#xff1a;夸克网盘分享 (quark.cn) 已安装的纯净版ubuntu虚拟…

招联金融2025秋招--大量招后台、算法

【投递方式】 直接扫下方二维码&#xff0c;或点击内推官网https://wecruit.hotjob.cn/SU61025e262f9d247b98e0a2c2/mc/position/campus&#xff0c;使用内推码 igcefb 投递 【招聘岗位】 后台开发 前端开发 数据开发 数据运营 算法开发 技术运维 软件测试 产品策划 产品运营…

Day05 日期类OJ题目

计算日期到天数转换_牛客题霸_牛客网根据输入的日期&#xff0c;计算是这一年的第几天。 保证年份为4位数且日期合法。 进阶&#xff1a;时。题目来自【牛客题霸】https://www.nowcoder.com/share/jump/4938575031726974727572 根据输入的日期&#xff0c;计算是这一年的第几…