数据结构(六):冒泡排序、选择排序、插入排序、希尔排序、快速排序

news2025/7/27 17:46:18

数据结构(六)

  • 一、大O表示法
  • 二、冒泡排序
  • 三、选择排序

一、大O表示法

在计算机中采用粗略的度量来描述计算机算法的效率,这种方法被称为“大O”表示法。
我们判断一个算法的效率,不能只凭着算法运行的速度,因为随着数据量的变化,算法的速度会发生变化,所以我们应该:

根据算法的速度随着数据量的变化会如何变化,这样的方式来表示算法的效率,大O表示法就是方式之一。

推导大O表示法:
规则一:用常量1取代运行时间中所有的加法常量。如7 + 8 = 15,用1表示运算结果15,大O表示法表示为O(1);
规则二:运算中只保留最高阶项。如N^3 + 3n +1,大O表示法表示为:O(N³);
规则三:若最高阶项的常数不为1,可将其省略。如4N2,大O表示法表示为:O(N²);

接下来是我们的集中排序算法:
简单排序:冒泡排序、选择排序、插入排序;
高级排序:希尔排序、快速排序;
我们封装一个列表来存储数据和排序算法

class ArrayList {
	 constructor() {
	     this.arr = []
	 }
	
	 insert(element) {
	     return this.arr.push(element);
	 }
	
	 toString() {
	     return this.arr.join(' ');
	 }
}
	
	let list = new ArrayList();
	list.insert(4);
	list.insert(5);
	list.insert(2);
	list.insert(1);
	list.insert(3);
	console.log(list.toString());

二、冒泡排序

我先自己写了一遍,我发现我写的这个其实是有问题的,内层循环控制两个元素依次比较,外层循环控制比较的趟数。这样写虽然能实现,但是你会发现其实内层循环每次都要比较arr.length-1次,而实际上后面元素如果排好的话,根本不需要再比较了,比如21345,那么345就不用再比较了。

1.冒泡排序
bubbleSort() {
   for(let i = 0; i < this.arr.length-1; i++) {
       for(let i = 0; i < this.arr.length-1; i++) {
	       if(this.arr[i] > this.arr[i+1]) {
	       		//交换两个位置的值
	           let zzy = this.arr[i+1];
	           this.arr[i+1] = this.arr[i];
	           this.arr[i] = zzy;
	       }
   		}
   }
   return this.arr
}

这样的话就需要进行一些小小的改进:
改进的就是这个for循环的次数,拿[4,2,1,3]来举例,外层循环控制趟数,那么4个数比较3趟,依次递减(j=3第一趟,j=2第二趟,j=1第三趟),每一趟中都要两两比较,从下标为0开始,依次比较j次(j=3第一趟比较3次,j=2第二趟比较2次,j=1第三趟比较1次)。

总结:4个数要比较三趟,第一趟比较3次,第二趟比较2次,第三趟比较1次

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

在这里插入图片描述

冒泡排序的效率:

上面所讲的对于7个数据项,比较次数为:6 + 5 + 4 + 3 + 2 + 1;
对于N个数据项,比较次数为:(N - 1) + (N - 2) + (N - 3) + … + 1 = N * (N - 1) / 2;
如果两次比较交换一次,那么交换次数为:N * (N - 1) / 4;

使用大O表示法表示比较次数和交换次数分别为:O(N*(N - 1)/2)和O(N*(N - 1)/4),根据大O表示法的三条规则都化简为:O(N²);

三、选择排序

占个坑,先学React去了

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

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

相关文章

为什么都在喊数据可视化?它究竟怎么做?

在数字化转型的浪潮中&#xff0c;不论是传统行业&#xff0c;还是新兴行业总会提到“数据可视化”这个词。那数据可视化到底是什么&#xff1f;为什么会受到那么多人追捧&#xff1f;又该怎么才能做到数据可视化呢&#xff1f; 一、数据可视化是什么&#xff1f; 首先“可视…

VC++ 解决dll库动态库加载失败问题(调用LoadLibrary加载失败)(附源码)

目录 1、动态加载dll库去调用库中的函数 1.1、调用系统dll库中未公开的接口 1.2、调用控件库中的注册接口向系统中注册该控件 2、LoadLibrary动态加载dll库失败的场景 2.1、自制安装包中遇到的LoadLibrary加载dll库失败问题 2.2、主程序底层模块调用LoadLibrary加载dll库…

企企通聚源池| 聚合海量资源全网寻源,赋能供采双方撮合交易

目前&#xff0c;我们正处于一个飞速发展的信息时代&#xff0c;随着大数据时代的来临&#xff0c;在企业的日常经营中&#xff0c;数据无处不在&#xff0c;各类数据的采集、整合、分析对企业的发展、决策有着十分重要的作用。数据管理作为企业一项重要的建设工作&#xff0c;…

1089. 烽火传递

Powered by:NEFU AB-IN Link 文章目录1089. 烽火传递题意思路代码1089. 烽火传递 题意 烽火台是重要的军事防御设施&#xff0c;一般建在交通要道或险要处。 一旦有军情发生&#xff0c;则白天用浓烟&#xff0c;晚上有火光传递军情。 在某两个城市之间有 n座烽火台&#xff0…

ChatGPT也懂如何设计开发板!?

到底应该如何设计一款开发板&#xff1f;我们问了一下最近风很大的ChatGPT&#xff0c;得出了这样的回答&#xff1a; 或者这样的回答&#xff1a; 显而易见&#xff0c;RK3568开发板是一款功能丰富&#xff0c;性能优异&#xff0c;易于开发的高性能开发板&#xff0c;适用于各…

SpringIOC源码解析

Spring深度学习&#xff08;一&#xff09;——IOC的设计理念Spring的核心思想——IOCSpring流程图DEMO编写Spring IoC容器的加载过程实例化化容器&#xff1a;AnnotationConfigApplicationContext实例化建BeanDefinition读取器&#xff1a; AnnotatedBeanDefinitionReaderBean…

设计模式之建造者模式(C++)

作者&#xff1a;翟天保Steven 版权声明&#xff1a;著作权归作者所有&#xff0c;商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处 一、建造者模式是什么&#xff1f; 建造者模式是一种创建型的软件设计模式&#xff0c;用于构造相对复杂的对象。 建造者模式可以…

【GANs】什么是饱和损失函数 Non-Saturating LossFunction

Saturating VS Non-Saturating Loss functions in GANs【GANs】什么是饱和损失函数 Non-Saturating LossFunctionSaturating VS Non-Saturating Loss functions in GANs 饱和Loss 普通GAN loss是生成器希望最小化被判断为假的概率。x取值范围是[0,1]&#xff0c;所以图中函数…

一篇五分生信临床模型预测文章代码复现——FIgure 9.列线图构建,ROC分析,DCA分析 (五)

之前讲过临床模型预测的专栏,但那只是基础版本,下面我们以自噬相关基因为例子,模仿一篇五分文章,将图和代码复现出来,学会本专栏课程,可以具备发一篇五分左右文章的水平: 本专栏目录如下: Figure 1:差异表达基因及预后基因筛选(图片仅供参考) Figure 2. 生存分析,…

酷开系统AI人工智能技术,为营销抢夺更多目标消费者

随着越来越多的年轻群体回归家庭&#xff0c;互联网电视产业正在时代的浪潮下快速发展&#xff0c;如今已经有数以万计的家庭消费者倾向于在客厅场景中使用大屏电视观看更多丰富的电视节目&#xff0c;而这一趋势&#xff0c;对于急需线上互动营销渠道的企业和品牌方来说&#…

论文阅读笔记——《室内服务机器人的实时场景分割算法》

一、主要工作 通过深度可分离卷积、膨胀卷积和通道注意力机制设计轻量级的高准确度特征提取模块。融合浅层特征与深层语义特征获得更丰富的图像特征。在NYUDv2和CamVid数据集上的MIoU分别达到72.7%和59.9%&#xff0c;模型的计算力为4.2GFLOPs&#xff0c;参数量为8.3Mb。 二…

Hugging face 模型微调学习:T5-base的微调

最近想做一点文本生成的小实验&#xff0c;无意发现了NLPer应该了解到了一个网站&#xff1a;Hugging face。 Hugging face 在 github上开源了一个Transformers库&#xff0c;允许用户上传和下载的预训练的模型&#xff0c;并进行原有模型的基础上进行微调。如此&#xff0c;使…

【软件测试】web自动化测试如何开展合适?自动化测试用例如何设计?资深测试的总结......

目录&#xff1a;导读前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09;前言 首先&#xff0c;还…

RK3588通用布线设计指南

&#xff08;1&#xff09;走线长度应包含过孔和封装。&#xff08;2&#xff09;由于表贴器件的焊盘会导致阻抗降低&#xff0c;为减小阻抗突变的影响&#xff0c;建议在表贴焊盘的正下方按焊盘大小挖去一层参考层。常用的表贴器件有&#xff1a;电容、 ESD、共模抑制电感、连…

docker部署gitlab过程中遇到的一些问题记录

文章目录用nginx代理docker部署的gitlab服务密码重置docker0网卡异常离线安装apt的包用nginx代理docker部署的gitlab服务 一般咱们不会去暴露很多端口给外面&#xff0c;所以部署完gitlab后&#xff0c;我希望能够用nginx来代理我们的gitlab服务。 gitlab的docker部署参考这个…

手把手教你使用vite打包自己的js代码包并推送到npm

准备 要有npm账号&#xff0c;没有的铁子去npm官网注册一个&#xff0c;又不要钱。 使用vite创建项目 一行代码搞定 npm create vite viet-demo框架选择Others 模板选择library 选择ts 这样项目就创建完了 这个项目默认有一个函数&#xff0c;用来记录按钮的点击次数并…

TCP协议和TCP连接

TCP协议和TCP连接一、TCP协议的简介二、TCP连接的简介1、TCP连接的建立&#xff08;TCP三次握手&#xff09;2、TCP连接的断开&#xff08;TCP四次挥手&#xff09;一、TCP协议的简介 TCP&#xff08;Transmission Control Protocol&#xff09;传输控制协议是一种面向连接的、…

“御黑行动”进行中,三月重保单位已开放接入!

三月重保在即&#xff0c;对于诸多政企单位来说&#xff0c;正面临着特殊时期的安全保障工作这一重要“大考”。 面对越来越专业且隐匿的攻击&#xff0c;各单位承受着巨大压力&#xff0c;尤其是政府、国企、央企等具有重要地位及广泛社会影响面的单位&#xff0c;其网站及业务…

opencv图像的算术运算

大家好&#xff0c;我是csdn的博主&#xff1a;lqj_本人 这是我的个人博客主页&#xff1a; lqj_本人的博客_CSDN博客-微信小程序,前端,python领域博主lqj_本人擅长微信小程序,前端,python,等方面的知识https://blog.csdn.net/lbcyllqj?spm1011.2415.3001.5343哔哩哔哩欢迎关注…

chatgpt如何解决模型训练过程中一些未知错误:以xgboot devices_.IsEmpty为例

本文尝试用现在最火的chatGPT在工作中提高生产力。具体背景如下&#xff1a;在训练模型过程中&#xff0c;为了避免资源抢占&#xff0c;我指定了其他的gpu来提高模型训练效率&#xff0c;但是发现训练的时候模型正常&#xff0c;但是在模型预测的时候一直报错&#xff0c;尝试…