1.JS排序算法之冒泡排序

article/2025/11/9 19:38:24

冒泡排序(Bubble Sort),顾名思义类似于水中冒泡,较大的数沉下去,较小的数慢慢冒起来。通过交换元素位置,达到排序目的,是一种交换排序。

目录

一、冒泡算法原理

二、冒泡算法分析

三、冒泡算法应用实例

四、冒泡排序适用场景


一、冒泡排序算法原理

1.思路

冒泡排序的实现思路是比较任意两个相邻的项, 如果前者比后者大, 则将它们互换位置.

2.流程描述:(以非递减为例)

从第一个元素开始比较相邻的元素。如果第一个比第二个大,就交换他们两个。交换后的第二个元素与第三个元素比较,以此类推直到比较到最后一个元素(实际是倒数第二个元素),称为一趟排序。
n个元素的冒泡排序趟数最多为n-1
每一趟排序都可以得到该趟最大的元素

3.举例:

例:35, 33, 42, 10, 14, 19, 27, 44,

第一趟排序:33,35,10,14,19,27,42

第二趟排序:33,10,14,19,27,35,42

第三趟排序:  10,14,19,27,33,35,42

第四趟排序:  10,14,19,27,33,35,42

······

4.动画演示:
在这里插入图片描述

二、冒泡排序算法分析

最好时间复杂度:

O(n)   当输入的数据已经是正序时,比较次数为n-1,无数据交换(优化后的冒泡排序)

最坏时间复杂度:

O(n²)  当输入的数据是反序时,比较次数为1+2+3+...+(n-1) = n(n-1) /2

平均时间复杂度

O(n²)  当输入的数据是乱序时,比较趟数(n - 1)(n + 1) / 2 = (n² - 1)/2

空间复杂度

O(1)  原地排序,辅助空间相对于数据量而言是个常数

稳定性

冒泡排序是稳定排序,不会改变数据的大小相对位置

平均时间复杂度计算

平均复杂度就是加权平均期望时间复杂度,这里我们采用"有序度" 和“逆序度” 来分析。
有序度:数组中具有有序关系的元素对的个数。有序元素用数学表达式就是这样:
有序元素对:a[i] <= a[j], 如果 i < j。(找非逆序对)

比如倒序排列的数组,6 5 4 3 2 1 ,有序度就是 0;
有序数组,比如 1 2 3 4 5 6 ,有序度就是 n*(n-1)/2 也就是15,把这种完全有序的数组的有序度叫作满有序度。并且 逆序度 = 满有序对 - 有序对
用之前的 4,5,6,3,2,1举例来看,有序元素对 (4,5)(4,6)(5,6) 有序度是 3。满有序度: n*(n-1)/2=15。冒泡排序包含的两个操作元素,比较和交换。每交换一次,有序度就加1.不管算法怎么改交换次数总是确定的,即为逆序度, n*(n-1)/2–初始有序度。此例中就是 15–3=12,要进行 12 次交换操作。

对于包含 n 个数据的数组进行冒泡排序,平均交换次数是多少呢?最坏情况下,初始状态的有序度是 0,所以要进行 n*(n-1)/2 次交换。最好情况下,初始状态的有序度是 n*(n-1)/2,就不需要进行交换。我们可以取个中间值 n*(n-1)/4,来表示初始有序度既不是很高也不是很低的平均情况。换句话说,平均情况下,需要 n*(n-1)/4 次交换操作,比较操作肯定要比交换操作多,而复杂度的上限是 O(n^2 ),所以平均情况下的时间复杂度就是 O(n^2 )。这个平均时间复杂度推导过程其实并不严格,但是很多时候很实用,毕竟概率论的定量分析太复杂,不太好用。

(感谢@另维吖,原文地址https://blog.csdn.net/qq_40488936/article/details/105558986?utm_source=app&app_version=4.9.1)

三、冒泡排序算法应用实例

1.简单交换排序

简单交换排序的原理是,用每一个位置的元素,与其他位置元素一一比较,反序则交换,每趟排序得到一个最(小)值。这种排序方法使得每一个元素都经历多次位置的变换,会造成每趟排序对其余关键字的排序没有帮助。

// 以非递减排序
var arr = [9,1,5,8,3,7,4,6,2];
console.log('原数组:'+ arr);// 标记原数组
function simpleExchangeSort(arr) {var len = arr.length;for (var i = 0; i < len; i++) {var num = 1;   // 标记交换次数for (var j = i+1; j < len; j++) {  if (arr[i] > arr[j]) {        var temp = arr[j];       arr[j] = arr[i];arr[i] = temp;console.log('第' + (i+1) + '趟排序的第'+(num++)+'次交换:' + arr); // 标记交换}}console.log('第' + (i+1) + '趟排序:' + arr);// 标记趟数}return arr;
}simpleExchangeSort(arr);

2.冒泡排序

基于简单交换排序,因为每趟排序都可以得到一个确定排序顺序(最大值)的元素,当其余元素都排好了顺序。 最后一个元素自然也就不需要排序,排序趟数的增加,已经排好顺序的数不需要再交换,使得比较交换的次数也在减少。例如5个元素,排序趟数为4趟,每趟比较交换次数从4次依次递减。

var arr = [9,1,5,8,3,7,4,6,2];
console.log('原数组:'+ arr);// 标记原数组
function bubbleSort(arr){//外层循环,控制趟数,每一次找到一个最大值for (var i = 0; i < arr.length - 1; i++) {// 内层循环,控制比较的次数,并且判断两个数的大小var num = 1;for (var j = 0; j < arr.length - 1 - i; j++) {// 如果前面的数大,放到后面(当然是从小到大的冒泡排序)if (arr[j] > arr[j+1]) {var temp = arr[j+1];arr[j+1] = arr[j];arr[j] = temp;console.log('第' + (i+1) + '趟排序的第'+(num++)+'次交换:' + arr); // 标记交换}}console.log('第' + (i+1) + '趟排序:' + arr);// 标记趟数}return arr;
}
bubbleSort(arr);

3.冒泡排序再优化

冒泡排序的优化是基于有序数据的情况下不进行无意义的循环,为交换设置标记,无数据交换时说明已有序。

var arr = [3,2,1,4,5,6,7,8,9];
console.log('原数组:'+ arr);// 标记原数组
function bubbleSortBetter(arr){//外层循环,控制趟数,每一次找到一个最大值for (var i = 0; i < arr.length - 1; i++) {// 内层循环,控制比较的次数,并且判断两个数的大小var num = 1;var flag = true;for (var j = 0; j < arr.length - 1 - i; j++) {// 如果前面的数大,放到后面(当然是从小到大的冒泡排序)if (arr[j] > arr[j+1]) {var temp = arr[j+1];arr[j+1] = arr[j];arr[j] = temp;flag = false;console.log('第' + (i+1) + '趟排序的第'+(num++)+'次交换:' + arr); // 标记交换}}if(flag){break;}console.log('第' + (i+1) + '趟排序:' + arr);// 标记趟数}return arr;
}
bubbleSortBetter(arr);

四、冒泡排序算法适用场景

冒泡排序是最简单的一种排序,但时间复杂度较高

只适用于数据规模较小且接近正序的数据。


http://chatgpt.dhexx.cn/article/3H1UaZIg.shtml

相关文章

js之排序算法简洁

1、冒泡排序 1.1从右往左两两比较&#xff0c;把每轮的最小值放在了arr[i]. 双重for循环 外层循环&#xff1a;定位。 内层&#xff1a;比较交换。 最好时间复杂度&#xff1a;O&#xff08;n&#xff09; 最差时间复杂度&#xff1a;O&#xff08;n^2&#xff09; 平均时间复杂…

JavaScript算法-排序算法

​ 此生之路&#xff0c;我将走过&#xff1b;走过这一次&#xff0c;便再也无法重来。所有力所能及的善行&#xff0c;所有充盈于心的善意&#xff0c;我将毫不吝惜&#xff0c;即刻倾予。我将再不拖延&#xff0c;再不淡漠&#xff0c;只因此生之路&#xff0c;再也无法重来。…

一个简单的js快速排序算法

简介&#xff1a; 快速排序是对冒泡排序的一种改进。它的基本思想是&#xff1a; 通过一趟排序将要排序的数据分割成独立的两部分&#xff0c;其中一部分的所有数据都比另外一部分的所有数据都要小&#xff0c;然后再按此方法对这两部分数据分别进行快速排序&#xff0c;整个排…

js排序算法详解-插入排序

全栈工程师开发手册 &#xff08;作者&#xff1a;栾鹏&#xff09; js系列教程5-数据结构和算法全解 js排序算法详解-插入排序 插入排序的原理其实很好理解&#xff0c;可以类比选择排序。选择排序时在两个空间进行&#xff0c;等于说每次从旧的空间选出最值放到新的空间&am…

JS 常见排序算法汇总(全)

文章目录 排序算法总结JS 十大排序算法冒泡排序单向冒泡双向冒泡选择排序插入排序快速排序归并排序桶排序基数排序计数排序 排序算法总结 JS 十大排序算法 冒泡排序 作为最简单的排序算法之一&#xff0c;冒泡排序感觉就像Abandon在单词书里出现的感觉一样&#xff0c;每次都…

常用排序算法(js)

复习排序算法 时间复杂度、空间复杂度、稳定新 排序算法时间复杂度空间复杂度稳定性冒泡O(n^2)O(1)是选择O(n^2)O(1)不是插入O(n^2)O(1)是希尔O(nlogn)O(1)不是快速O(nlogn)O(nlogn)不是 1. 冒泡排序 思路&#xff1a;每一轮都对相邻的两个元素进行比较&#xff0c;如果逆序…

JS实现快速排序算法

快速排序的基本思想是选择数组中的一个元素作为关键字&#xff0c;通过一趟排序&#xff0c;把待排序的数组分成两个部分&#xff0c;其中左边的部分比所有关键字小&#xff0c;右边的部分比所有关键字大。然后再分别对左右两边的数据作此重复操作&#xff0c;直到所有元素都有…

JavaScript排序算法专栏(JS十大排序算法详解)

一、冒泡排序 1、Explanation And Steps&#xff08;解释的步骤&#xff09; 冒泡排序&#xff08;Bubble Sort&#xff09;也是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的…

JS实现经典的排序算法

几大经典排序算法实现&#xff1a; 1.排序算法介绍&#xff1a; 2.基本算法 2.1 冒泡排序 function bubbleSort(arr) {var len arr.lengthfor (var i 0; i < len; i) {for (var j 0; j < len - 1 - i; j) {if (arr[j] > arr[j 1]) {;[arr[j], arr[j 1]] [arr…

js实现常见排序算法

文章目录 前言一、排序相关概念1.比较排序和非比较排序比较排序非比较排序 2.稳定性和不稳定性 二、各排序算法对比三、排序算法中的通用函数以及对数器1.通用函数交换函数取两索引的中间下标&#xff0c;中间值mid 2.对数器 四、各排序算法的实现1.冒泡排序算法思想过程图解代…

js-常见排序算法

目录 一、选择排序 二、冒泡排序 三、插入排序 1. 希尔排序 四、归并排序 五、快速排序 版权声明&#xff1a;本文为博主原创文章&#xff0c;若文章中有错误请联系博主改正&#xff0c;请不要恶意留言(不喜欢请绕道)。欢迎大家转载&#xff0c;转载时请注明原文地址:https://b…

3.JS排序算法之选择排序

选择排序&#xff08;selectSort&#xff09;&#xff0c;顾名思义&#xff0c;每次选择最值进行排序 目录 一、选择排序算法原理 二、选择排序算法分析 三、选择排序算法应用实例 四、选择排序的适用场景 一、选择排序算法原理 1.思路 选择排序的实现思路是从未排序序列中…

JavaScript实现十大排序算法(图文详解)

冒泡排序 排序的效果图 解法 当前解法为升序 冒泡排序的特点&#xff0c;是一个个数进行处理。第i个数&#xff0c;需要与后续的len-i-1个数进行逐个比较。 为什么是 len-i-1个数&#xff1f; 因为数组末尾的i个数&#xff0c;已经是排好序的&#xff0c;确认位置不变的了。…

JS 常见的排序算法

工作中算法不常用&#xff0c;但是排序经常用。因此在这里整理了几种JS中常见的排序算法。 冒泡排序 1、算法思想&#xff1a;判断两个相邻元素&#xff0c;大于则交换位置 2、算法步骤 从数组中第一个数开始&#xff0c;依次与下一个数比较并次交换比自己小的数&#xff0c…

详细解析十大排序算法(js实现)

详细解析十大排序算法js实现 算法概述1.冒泡排序1.1算法描述1.2动图演示1.3代码实现 2.选择排序2.1算法描述2.2动图演示2.3代码实现2.4算法分析 3.插入排序3.1算法描述3.2动图演示3.3代码实现3.4算法分析 4.希尔排序4.1算法描述4.2动图演示4.3代码实现4.4算法分析 5.归并排序5.…

Excel中使用SUMIFS公式时计算结果不正确(原因:有超过15位数字的长编码)

在使用SUMIFS公式进行多条件求和时发现求和结果部分正确&#xff0c;部分错误。 常见原因&#xff1a; 1、公式错误 2、数据格式有问题或者有空格等 仔细检查后发现并不是上述两个原因&#xff0c;而是求和的公式中涉及到超过15位数字的长编码。常见的SUMIF、SUMIFS、COUNTIF等…

mybatis-plus使用

1 mybaitsplus简介 &#xff08;1&#xff09;对于mybatis功能的增强&#xff0c;具体的体现就是对于单表的操作都生成好了&#xff0c;分页&#xff0c;条件查询使用很方便&#xff0c;例如查询操作&#xff0c;直接使用wrapper的实现类&#xff0c;调用方法进行条件的增加&a…

四、Hibernate框架的API (三)-- Session对象

一、Session对象 1.Hibernate最重要的对象,只用使用hibernate与数据库操作&#xff0c;都用到这个对象2.该对象维护了一个Connection对象。代表了与数据库连接的会话。3.该对象实质上是对Connection对象的包装&#xff0c;在Connection对象基础之上&#xff0c;封装了一些方法。…

Criteria的用法

一、Hibernate提供了5种检索对象的方式 1.导航对象图检索方式&#xff1a;根据已经加载的对象导航到其他对象    from Emp e group by e.dept.deptName 2.OID检索方式&#xff1a;按照对象的OID来检索对象   get/load 3.HQL检索方式&#xff1a;使用面向对象的HQL查询语…

第13章:处理Excel电子表格(笔记)

13.1&#xff1a;Excel文档 13.2&#xff1a;安装openpyxl模块 pip install --user --Uopenpuxl2.6.2 这是安装2.6.2版本的&#xff0c;比较新的版本与学习的书籍的信息有一点不兼容 13.3&#xff1a;读取Excel文档 13.3.1&#xff1a;用openpyxl模块打开Excel文档 import …