js的算法-交换排序(冒泡)

news2025/1/12 9:56:44

交换排序

所谓交换排序,是指根据序列中两个元素关键字的比较结果来对换这两个记录在序列中的位置。基于交换的排序算法很多,本次介绍冒泡排序和快速排序。

冒泡

基本思想

从后往前(或从前往后)两两比较相邻元素的值,若为逆序(即A【i-1】>A【i】),则交换它们;直到序列比较完成。这是第一趟冒泡,结果是将最小的元素交换到待排序列的第一个位置(或者将最大的元素交换到待排序列的最后一个位置),关键字最小的元素如同气泡一样捉奸往上“漂浮”直至“水面”(或关键字最大的元素如石头一样下沉到水底);
下一一趟冒泡是,前一趟确定的最小元素不再参与比较,每次冒泡的结果就是序列中最小元素(或者最大元素)放到了序列的最终位置;循环往复;
这样最多做n-1趟冒泡就能把所有元素排好序。

演示

第一趟:
在这里插入图片描述

第二趟
在这里插入图片描述
后续
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码展示

let ary = [5, 9, 3, 1, 2, 8, 4, 7, 6];
let max = ary.length - 1;

for (let index = 0; index < max; index++) {
  // 第一层是循环次数
  for (let item = max; item > index; item--) {
    // 第二层比较
    // 从最后一个元素开始,进行两两比较
    // 后者(开始位置)比前者小就交换,保证最小的数都交换到了第i个位置上去了
    if (ary[item] < ary[item - 1]) {
      let temp = ary[item];
      ary[item] = ary[item - 1];
      ary[item - 1] = temp;
    }
  }
  console.log("ary", JSON.stringify(ary));
  console.log("****");
}
for (let i in ary) {
  console.log(ary[i]);
}

结果:

ary [1,5,9,3,2,4,8,6,7]
****
ary [1,2,5,9,3,4,6,8,7]
****
ary [1,2,3,5,9,4,6,7,8]
****
ary [1,2,3,4,5,9,6,7,8]
****
ary [1,2,3,4,5,6,9,7,8]
****
ary [1,2,3,4,5,6,7,9,8]
****
ary [1,2,3,4,5,6,7,8,9]
****
ary [1,2,3,4,5,6,7,8,9]
****
1
2
3
4
5
6
7
8
9

写成方法

let ary = [5, 9, 3, 1, 2, 8, 4, 7, 6];
/**
 *
 * @param {*} ary 数组
 * @param {*} length 长度
 * @param {*} isDown 是否降序 默认是降序
 * @returns
 */
// 排序写成方法
function arraySort(ary, length, isDown = false) {
  // 第一层是循环次数
  for (let index = 0; index < length - 1; index++) {
    for (let item = length - 1; item > index; item--) {
      // 第二层比较
      // 从最后一个元素开始,进行两两比较
      // 后者(开始位置)比前者小就交换,保证最小的数都交换到了第i个位置上去了
      // 判断是否降序
      let expre = isDown
        ? ary[item] < ary[item - 1]
        : ary[item] > ary[item - 1];
      if (expre) {
        let temp = ary[item];
        ary[item] = ary[item - 1];
        ary[item - 1] = temp;
      }
    }
  }
  return ary;
}
let arr = arraySort(ary, ary.length, true);
console.log("ary", JSON.stringify(ary));

结果:

ary [1,2,3,4,5,6,7,8,9]

性能分析

时间复杂度空间复杂度
最坏情况下时间复杂度为O(n^2); 比较次数为n(n-1)/2;移动次数为3n(n-1)/2;
最好情况下时间复杂度为O(n);比较次数为n-1;移动次数为0;仅使用了常数个辅助单元,所以空间复杂度为O(1 )

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

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

相关文章

新风口下的必应bing国内广告投放该怎么做?

必应Bing作为全球搜索引擎市场的重要参与者&#xff0c;正逐渐显现出其在国内市场的独特价值和潜力。随着互联网生态的多元化发展&#xff0c;必应Bing凭借其高质量用户群和精准投放能力&#xff0c;成为了企业寻求新增长点的新风口。 一、洞察先机&#xff0c;精准定位市场 …

考研数学|跟武忠祥做《660》很吃力,要不要换张宇❓

不建议&#xff01; 我就是个妥妥的二战选手&#xff0c;一战听完汤家凤的课发现大量的题还是不会做&#xff0c;于是冒险把张宇的基础课听完一遍&#xff0c;毫不夸张的硕导致我最后没有强化阶段直接进入冲刺。可想而知&#xff0c;这能考好吗&#xff1f;21年数三87分&#…

ChromaDB教程

使用 Chroma DB&#xff0c;管理文本文档、将文本嵌入以及进行相似度搜索。 随着大型语言模型 &#xff08;LLM&#xff09; 及其应用的兴起&#xff0c;我们看到向量数据库越来越受欢迎。这是因为使用 LLM 需要一种与传统机器学习模型不同的方法。 LLM 的核心支持技术之一是…

JavaEE:File类查询一个文件的路径(举例+源码 )

一、File类概述 Java 中通过 java.io.File 类来对一个文件&#xff08;包括目录&#xff09;进行抽象的描述。File 类中的方法可以对文件路径以及文件名等信息进行查询&#xff0c;也可以对文件进行各项增删改操作&#xff0c;本文主要介绍 File 类的查询方法。 二、代码示例 …

git忽略文件配置 !

.gitignore中!表示取反 注意&#xff0c;如果父目录被排除&#xff0c;则父目录下的子目录也会被排除&#xff0c;此时对父目录下的子目录取反也不会生效&#xff0c;比如存在目录结构&#xff0c;再.gitignore目录下配置的 /*&#xff08;排除所有文件&#xff09;&#xff0c…

构建Java线程间的默契:学习wait()、notify()和notifyAll()方法的巧妙运用

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

【源码】权益商城系统源码,支持多种支付方式

权益商城系统源码&#xff0c;支持多种支付方式&#xff0c;后台商品管理&#xff0c;订单管理&#xff0c;串货管理&#xff0c;分站管理&#xff0c; 会员列表&#xff0c;分销日志&#xff0c;应用配置。 上传到服务器&#xff0c;修改数据库信息&#xff0c;导入数据库&a…

C语言入门课程学习记录4

C语言入门课程学习记录4 第18课 - signed 与 unsigned第19课 - 再论数据类型第20课 - 经典问题剖析第21课 - 程序中的辅助语句&#xff08;上&#xff09;第22课 - 程序中的辅助语句&#xff08;下&#xff09; 本文学习自狄泰软件学院 唐佐林老师的 C语言入门课程&#xff0c;…

【高频】基于GBDT-FM模型的level-2高频数据实证研究(二)

【高频】基于GBDT-FM模型的level-2高频数据实证研究&#xff08;二&#xff09; 原创 Yud. 2AMquant 2024-04-04 11:30 广东 上一篇中初步提及了Level2数据中常见变量指标的构建方式&#xff0c;以及其带来的价格冲击。此篇将使用GBDT-LM模型对短程价格走势进行简单预测。 ps…

前端css中的transform(转换)的使用

前端css中的transform的使用 一、前言二、流程图三、举例&#xff08;一&#xff09;、平移1.平移&#xff0c;源码12.源码1运行效果(1).视频效果(2).截图效果 3.平移3d效果&#xff0c;源码24.源码2运行效果&#xff08;1&#xff09;、视频效果&#xff08;2&#xff09;、截…

【C语言】红黑树详解以及C语言模拟

一、红黑树的性质二、红黑树的旋转操作三、红黑树的插入操作四、红黑树的删除操作五、红黑树的应用六、C语言模拟红黑树七、总结 红黑树是一种自平衡二叉查找树&#xff0c;它能够保持树的平衡&#xff0c;从而确保查找、插入和删除的最坏情况时间复杂度为O( l o g n log_n log…

41-数组 _ 数组作为函数参数

41-1 冒泡排序函数的设计 数组传参的时候&#xff0c;形参有2种写法&#xff1a; 1、数组 2、指针 往往我们在写代码的时候&#xff0c;会将数组作为参数传个函数 如&#xff1a;实现一个冒泡排序&#xff0c;将数组的数据排成升序 冒泡排序的核心思想&#xff1a; 1、两…

新能源汽车小米su7

小米su7汽车 function init() {const container document.querySelector( #container );camera new THREE.PerspectiveCamera( 20, window.innerWidth / window.innerHeight, 1, 50000 );camera.position.set( 0, 700, 7000 );scene new THREE.Scene();scene.background ne…

kubebuilder(4)部署测试

将crd部署到k8s make install 日志&#xff1a; kustomize build config/crd | kubectl apply -f - customresourcedefinition.apiextensions.k8s.io/demoes.tutorial.demo.com created 查看下[rootpaas-m-k8s-master-1 demo-operator]# kubectl api-resources | grep demo de…

yolov8 区域声光报警+计数

yolov8 区域报警计数 1. 基础2. 报警功能2. 1声音报警代码2. 2画面显示报警代码 3. 完整代码4. 源码 1. 基础 本项目是在 yolov8 区域多类别计数 的基础上实现的&#xff0c;具体区域计数原理可见上边文章 2. 报警功能 设置一个区域region_points&#xff0c;当行人这一类别…

【AIGC调研系列】Phi-3 VS Llama3

2024-04-24日发布的Phi-3系列模型在多个方面展现出了对Llama-3的性能优势。首先&#xff0c;Phi-3-small&#xff08;7B参数&#xff09;在MMLU上的得分高于Llama-3-8B-Instruct模型&#xff0c;分别为75.3%和66%[1]。此外&#xff0c;具有3.8B参数的Phi-3 Mini在性能上优于Lla…

解密Java多线程同步:掌握线程间同步与互斥技巧

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一个人虽可以走的更快&#xff0c;但一群人可以走的更远。 我是一名后…

JavaScript:js实现在线五子棋人机(人人)对弈

在线五子棋人机对弈 全部使用前端技术,使用HTML,CSS以及JS进行实现. 棋盘在后端就是一个15*15的二维数组 页面设计 页面设计的比较粗糙 主要使用js自带的canvas画布进行绘画 HTML代码如下: <div class"outer"><canvas id"canvas" height&qu…

linux权限维持(四)

6.inetd服务后门 inetd 是一个监听外部网络请求 ( 就是一个 socket) 的系统守护进程&#xff0c;默认情况下为 13 端口。当 inetd 接收到 一个外部请求后&#xff0c;它会根据这个请求到自己的配置文件中去找到实际处理它的程序&#xff0c;然后再把接收到的 这个socket 交给那…

B2B企业如何做好谷歌Google广告推广营销布局?

当今全球化的商业环境中&#xff0c;B2B企业要想在激烈的市场竞争中脱颖而出&#xff0c;拓展海外市场成为了必经之路。而谷歌Google广告&#xff0c;作为全球最大的在线广告平台&#xff0c;无疑是企业触达全球潜在客户的黄金钥匙。云衔科技通过专业服务助力企业轻松开户与高效…