算法学习—排序

排序算法

一、选择排序

1.算法简介

选择排序是一个简单直观的排序方法,它的工作原理很简单,首先从未排序序列中找到最大的元素,放到已排序序列的末尾,重复上述步骤,直到所有元素排序完毕。

2.算法描述

1)假设未排序序列的第一个是最大值,记下该元素的位置,从前往后比较
2)若某个元素比该元素大,覆盖之前的位置
3)重复第二个步骤,直到找到未排序的末尾
4)将未排序元素的第一个元素和最大元素交换位置
5)重复前面几个步骤,直到所有元素都已经排序。

3.算法分析

选择排序的交换操作次数最好情况已经有序为0次,最坏情况逆序n-1次,因此交换操作次数位于0(n-1)次之间;比较操作次数(n-1+…+2+1+0)为n(n-1)/2次;交换元素赋值操作为3次,逆序需要n-1趟交换,因此,赋值操作位于03(n-1)次之间。由于需要交换位置,所以肯定是不稳定的。

时间复杂度均为o(n^2) 空间复杂度为o(1) 不稳定

4.代码实现

//选择排序
function selsetSort(arr){var len = arr.length;for(var i=0;i<len-1;i++){for(var j=i+1;j<len;j++){if(arr[i] > arr[j]){//寻找最小值var temp = arr[i];arr[i] = arr[j];arr[j] = temp;}}}return arr;
}

二、冒泡排序

1.算法简介

列表每两个相邻的数进行比较,如果前面的数比后面的数大,则交换这两个数,一轮排序完成后,则无序区减少一个数,有序区增加一个数。

2.算法描述

1)快速排序的特点就是随机设置一个基准点,比如是数组的第一个元素,然后数组的其他元素就跟这个基准线进行对比,比基准线大的放在左边,比基准线小的放在右边
2)再设置一个基准线,再这样小的放左边,大的放右边,递归。

3.算法分析

平均时间复杂度O(nn) 、最好情况O(n)、最差情况O(nn)

空间复杂度O(1) 稳定

4.代码实现

 function sort(arr){let len = arr.length;for (let i = 0; i < len - 1 ; i++) {// 用来标记在一轮冒泡过程中有无交换过let flag = false;for (let j = 0; j < len - i; j++) {if(arr[j] > arr[j+1]){// 交换两个数let temp = arr[j];arr[j] = arr[j+1];arr[j+1] = temp;flag = true;}}// 如果在一轮冒泡过程中没有交换过,说明此时的列表已经是排序好的了,直接结束循环if(!flag){return;}} }
let arr = [2,3,1,4,8,7,9,6];
this.sort(arr;
console.log(arr); 

三、插入排序

1.算法简介

所谓插入排序,就是把最小的(或者最大的),一次次插入到最前面,从而达到排序的效果

2.算法描述

刚开始将整个数组看作一个无序区,每一轮拿无序区的第一数与有序区的数从后往前依次进行比较,遇到更大的数则交换,每一轮排序完成后,有序区增加一个数,无序区减少一个数。

3.算法分析

时间复杂度是O(n*n) 空间复杂度为o(1) 稳定

4.代码实现

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

四、快速排序

1.算法简介

采用“分治”的思想,对于一组数据,选择一个基准元素(base),通常选择第一个或最后一个元素,通过第一轮扫描,比base小的元素都在base左边,比base大的元素都在base右边,再有同样的方法递归排序这两部分,直到序列中所有数据均有序为止。快速排序算法的性能比冒泡、选择排序都要好,和归并排序一样,是一个可以用于实战的算法。

2.算法描述

1)快速排序的特点就是随机设置一个基准点,比如是数组的第一个元素,然后数组的其他元素就跟这个基准线进行对比,比基准线大的放在左边,比基准线小的放在右边
2)再设置一个基准线,再这样小的放左边,大的放右边,递归。

3.算法分析

时间复杂度是O(nlogn) 空间复杂度为o(logn) 不稳定

4.代码实现

 function sort(arr,l,r){if(l < r){let i = l;let j = r;let mid = arr[l];while(i < j){while(arr[j] > mid && i < j){j--;}arr[i] = arr[j];while(arr[i] < mid && i < j){i++;}arr[j] = arr[i];}arr[i] = midthis.test(arr,l,i-1)this.test(arr,i+1,j)return arr}else{return}}, // 测试数据
let arr = [2,3,1,4,8,7,9,6];
let res = this.sort(arr,0,7);
console.log(res); 

五、归并排序

1.算法简介

使用分而治之的概念对给定的元素列表进行排序。它将问题分解为较小的子问题,直到它们变得足够简单以至可以直接解决为止。

2.算法描述

1)将给定的列表分为两半(如果列表中的元素数为奇数,则使其大致相等)。

2)以相同的方式继续划分子数组,直到只剩下单个元素数组。

3)从单个元素数组开始,合并子数组,以便对每个合并的子数组进行排序。

4)重复第 3 步单元,直到最后得到一个排好序的数组。

3.算法分析

时间复杂度是O(nlogn) 空间复杂度为O(n) 稳定

4.代码实现

function sort(arr){if(arr && arr.length > 1){const mid = Math.floor(arr.length/2)const left = arr.slice(0,mid)const right = arr.slice(mid);return this.merge(this.sort(left), this.sort(right))}return arr
},
function merge(leftList, rightList){const newList = [];const leftLength = leftList && leftList.length;const rightLength = rightList && rightList.length;let i = 0;let j = 0;while (i < leftLength && j < rightLength) {if (leftList[i] < rightList[j]) {newList.push(leftList[i++]);} else {newList.push(rightList[j++]);}}while (i < leftLength) {newList.push(leftList[i++]);}while (j < rightLength) {newList.push(rightList[j++]);}return newList;
}, 

六、堆排序

1.算法简介

堆是一种特殊的完全二叉树,堆分为大根堆和小根堆,满足任一节点都比其孩子节点大的一个完全二叉树就是大根堆,满足任一节点都比其孩子节点小的一个完全二叉树就是小根堆。

2.算法描述

首先构造一个大根堆(此时整个堆是无序区),然后将堆顶的元素取出放到有序区(也就是数组的最后),然后将堆的最后一个元素(也就是无序区的最后一个元素)放到堆顶,堆就少了一个元素,此时通过一次向下调整重新使堆有序,调整后的堆顶就是整个数组的第二大元素,然后重复之前的操作依次将元素放到有序区,直到堆变空,便可得到排序好的数组。

3.算法分析

时间复杂度是O(nlogn) 空间复杂度为O(1) 不稳定

4.代码实现

function sort(list) {if (list && list.length > 1) {const len = list.length;// 首先构造大根堆,从最后一个不是叶子节点的节点开始遍历,从后往前依次进行向下调整for (let i = Math.floor((len-2)/2); i>=0; i--) {sift(list, i, len-1);}// 然后将堆的第一元素与有序区的第一个元素进行交换,此时有序区增加一个,无序区减少一个,再进行一次堆的向下调整,然后重复上述操作,最终使整个数组有序for(let i = len-1; i>=0; i--){const m = list[0];list[0] = list[i];list[i] = m;sift(list, 0, i-1);} }
}/**
* 堆的向下调整
* 先从根节点开始,如果孩子节点比父节点大,则将该孩子节点赋值给父节点
* 然后指针指向下一层,重复上面的操作,直到找到孩子节点没有比父节点大的节点,终止循环
* 最后将原始的根节点赋值给当前父节点
*/
function sift(li, low, high) {const tmp = li[low]; // 缓存根节点let i = low; // 当前的父节点,最开始指向根节点let j = i*2+1; // 当前的孩子节点,最开始指向根节点的左孩子节点while (j <= high) {// 如果有右孩子节点且比左孩子节点大,则j指向右孩子节点if (j+1 <= high && li[j+1] > li[j]) {j++;}if (li[j] > tmp) {li[i] = li[j]; // 将较大的孩子节点赋值给父节点i = j; // i指向下一层j = i*2 +1;} else {break; // 如果当前子节点没有比原始根节点大,结束循环}}li[i] = tmp; // 最后将原始的根节点赋值给当前父节点
}

总结

排序算法复杂度总结图.png

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

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

相关文章

万宾科技监测设备,可燃气体监测仪特点一览

万宾科技的监测设备种类繁多&#xff0c;包括可燃气体监测仪、管网水位监测仪、内涝积水监测仪等。其中可燃气体监测仪是万宾科技的核心产品之一&#xff0c;用于监测环境中可燃气体的浓度&#xff0c;适用于对甲烷气体浓度进行实时监测&#xff0c;应用于燃气管网、排水管网、…

从cmd登录mysql

说明 先看看mysql.exe文件在哪个目录下&#xff0c;为了后面的操作方便&#xff0c;可以将该文件所在的路径增加到环境变量path中。 如果不增加到path环境变量中&#xff0c;那么在cmd窗口就要切换到mysql.exe文件所在的目录下执行。 在cmd窗口查看mysql命令的帮助信息 在cm…

编译原理:设计与实现一个简单词法分析器

设计与实现一个简单词法分析。具体内容是产生一个二元式文本文件&#xff0c;扩展名为dyd&#xff0c;可将Java或C程序(测试程序)分解成为一个一个的单词及类型。 &#xff08;选做&#xff1a;并查“单词符号与种别对照表”得出其种别&#xff0c;用一数字表示。&#xff09;…

CSS 多主题切换思路

前言 本篇仅提供多主题切换思路&#xff0c;示例简单且清晰。 实现 步骤一&#xff1a;多主题(颜色)定义 定义根伪类 :root&#xff0c;代码第 2 和 7 行。分别定义了默认和带参数的伪类&#xff1b;定义 CSS 变量&#xff0c;注意变量名需要以两个减号&#xff08;--&…

adb修改android系统时间 adb shell date必须要root权限

adb Command adb root //需要root权限 adb shell setprop persist.sys.timezone GMT //校准时区 adb shell date MMDDhhmmYY.ss set //修改系统时间这里是GMT格林尼治时间&#xff0c;北京时间得转换一下 8小时 adb shell hwclock -w //同步硬件时间adb shell date 0201030422…

初识Linux:权限

目录 提示&#xff1a;以下指令均在Xshell 7 中进行 Linux 的权限 内核&#xff1a; 查看操作系统版本 查看cpu信息 查看内存信息 外部程序&#xff1a; 用户&#xff1a; 普通用户变为超级用户&#xff1a; su 和 su-的区别&#xff1a; root用户变成普通用户&#…

机器人最优控制开源库 Model-based Optimization for Robotics

系列文章目录 文章目录 系列文章目录前言一、开源的库和工具箱1.1 ACADO1.2 CasADi1.3 Control Toolbox1.4 Crocoddyl1.5 Ipopt1.6 Manopt1.7 LexLS1.8 NLOpt1.9 qpOASES1.10 qpSWIFT1.11 Roboptim 二、其他库和工具箱2.1 MUSCOD2.2 OCPID-DAE12.3 SNOPT 前言 机器人&#xff…

【论文阅读】1 SkyChain:一个深度强化学习的动态区块链分片系统

SkyChain 一、文献简介二、引言及重要信息2.1 研究背景2.2 研究目的和意义2.3 文献的创新点 三、研究内容3.1模型3.2自适应分类账协议3.2.1状态块创建3.2.2合并过程3.2.3拆分过程 3.3评价框架3.3.1性能3.3.1.1共识延迟3.3.1.2重新分片延迟3.3.1.3处理事务数3.3.1.4 约束 3.3.2 …

【代码】基于麻雀搜索优化Kmeans图像分割算法

程序名称&#xff1a;基于麻雀搜索优化Kmeans图像分割算法 实现平台&#xff1a;matlab 代码简介&#xff1a;首先使用麻雀搜索优化算法来确定 K-means 算法的初始质心位置&#xff0c;然后进行传统的 K-means 聚类。这样做的目的是为了避免 K-means 算法陷入局部最优解&…

使用Docker安装部署Swagger Editor并远程访问编辑API文档

文章目录 Swagger Editor本地接口文档公网远程访问1. 部署Swagger Editor2. Linux安装Cpolar3. 配置Swagger Editor公网地址4. 远程访问Swagger Editor5. 固定Swagger Editor公网地址 Swagger Editor本地接口文档公网远程访问 Swagger Editor是一个用于编写OpenAPI规范的开源编…

还得是字节出来的,太秀了...

前段时间公司缺人&#xff0c;也面了许多测试&#xff0c;一开始瞄准的就是中级水准&#xff0c;当然也没指望能来大牛&#xff0c;提供的薪资在15-20k这个范围&#xff0c;来面试的人有很多&#xff0c;但是平均水平真的让人很失望。看了简历很多上面都是写有4年工作经验&…

MatrixOne Meetup回顾 | 深圳站

11月11日&#xff0c;MatrixOne 社区在深圳成功举办了第二次 MatrixOne Meetup。活动当天&#xff0c;数十位外部小伙伴到场参与&#xff0c;一同分享云原生数据库相关知识内容。此次活动&#xff0c;我们也邀请了来自深圳素问智能的外部讲师&#xff0c;分享了目前火爆的大模型…

【每日OJ —— 144. 二叉树的前序遍历】

每日OJ —— 144. 二叉树的前序遍历 1.题目&#xff1a;144. 二叉树的前序遍历2.方法讲解2.1.算法讲解2.2.代码实现2.3.提交通过展示 1.题目&#xff1a;144. 二叉树的前序遍历 2.方法讲解 2.1.算法讲解 1.首先如果在每次每个节点遍历的时候都去为数组开辟空间&#xff0c;这样…

steam搬砖项目到底能不能做?

在Steam的世界里&#xff0c;有一款引人注目的游戏——《CSGO》游戏设备和配件的搬运项目。它就像一个桥梁&#xff0c;连接着全球的游戏世界&#xff0c;为玩家们提供着精彩的设备和配件。原则上&#xff0c;这是一个低买高卖的过程&#xff0c;通过汇率差来赚取利润。比如&am…

从PDF和图像中提取文本,以供大型语言模型使用

想法 大型语言模型已经席卷了互联网&#xff0c;导致更多的人没有认真关注使用这些模型最重要的部分&#xff1a;高质量的数据&#xff01;本文旨在提供一些有效从任何类型文档中提取文本的技术。 Python库 本文专注于Pytesseract、easyOCR、PyPDF2和LangChain库。实验数据是一…

C 中的结构 - 存储、指针、函数和自引用结构

0. 结构体的内存分配 当声明某种类型的结构变量时&#xff0c;结构成员被分配连续&#xff08;相邻&#xff09;的内存位置。 struct student{char name[20];int roll;char gender;int marks[5];} stu1; 此处&#xff0c;内存将分配给name[20]、roll、gender和marks[5]。st1这…

zabbix 监控

zabbit 监控 非常成熟的监控软件。 运维人员&#xff0c;尽快系统服务器的状态&#xff0c;网站的流量&#xff0c;服务进程的运行状态。 保证整个集群的工作正常。7*24 zabbix是什么&#xff1a; web界面提供的一种可视化监控服务软件。 分布式的方式系统监控以及网络监控…

ts学习05-typeScript中的类

类的定义 class Person {name: string; //属性 前面省略了public关键词constructor(n: string) {//构造函数 实例化类的时候触发的方法this.name n;}run(): void {console.log(this.name);} } var p new Person("张三");p.run();class Person {name: string;//…

JOSEF约瑟 剩余电流保护器 CLJ3-100A+LH30 导轨安装

CLJ3系列剩余电流动作继电器 系列型号&#xff1a; CLJ3-100A剩余电流动作继电器 CLJ3-250A剩余电流动作继电器 CLJ3-400A剩余电流动作继电器 CLJ3-630A剩余电流动作继电器 LH30剩余电流互感器 LH80剩余电流互感器 LH100剩余电流互感器 LH140剩余电流互感器 一、产品概…

特征融合12种经典魔改方案汇总,附配套模型和代码

特征融合&#xff08;Feature Fusion&#xff09;是深度学习中的一种重要技术&#xff0c;它可以帮助模型更好地理解数据的内在结构和规律&#xff0c;提高模型的性能和泛化能力。另外&#xff0c;特征融合还可以提高模型的分类准确率&#xff0c;减少过拟合风险&#xff0c;帮…