算法学习—排序
排序算法
一、选择排序
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; // 最后将原始的根节点赋值给当前父节点
}
总结

相关文章:
算法学习—排序
排序算法 一、选择排序 1.算法简介 选择排序是一个简单直观的排序方法,它的工作原理很简单,首先从未排序序列中找到最大的元素,放到已排序序列的末尾,重复上述步骤,直到所有元素排序完毕。 2.算法描述 1ÿ…...
在Pycharm中创建项目新环境,安装Pytorch
在python项目中,很多项目使用的各类包的版本是不一致的。所以我们可以对每个项目有专属于它的环境。所以这个文章就是教你如何创建新环境。 一、创建新环境 首先我们需要去官网下载conda。然后在Pycharm下面添加conda的可执行文件。 用conda创建新环境。 二、…...
linux里source、sh、bash、./有什么区别
1、source source a.sh 在当前shell内去读取、执行a.sh,而a.sh不需要有"执行权限" source命令可以简写为"." . a.sh 注意:中间是有空格的。 2、sh/bash sh a.sh bash a.sh 都是打开一个subshell去读取、执行a.sh,而a.…...
IDEA编译器技巧-提示词忽略大小写
IDEA编译器技巧-提示词忽略大小写 写代码时,每次创建对象都要按住 Shift 字母 做大写开头, 废手, 下面通过编译器配置解放Shift 键 setting -> Editor -> General -> Code Completion -> Match case 把这个√去掉, 创建对象就不需要再按住 Shift 键 示例: 1.…...
【MySQL】MySQL安装 环境初始化
MySQL安装 MYSQL官网 安装完成后,傻瓜下一步即可 配置一下环境变量即可 (1) 初始化MySQL, 管理员身份运行 mysqld --initialize-insecure(2) 注册 mysqld mysqld -install# 如果记录以前的版本执行下面指令 mysqld -remove(3) 启动MySQL服务 // 启动mysql服务 net start …...
C# IList 与List区别二叉树的层序遍历
IList 接口: IList 是一个接口,定义了一种有序集合的通用 API。继承自 ICollection 接口和IEnumerable<T>,是所有泛型列表的基接,口它提供了对列表中元素的基本操作,如添加、删除、索引访问等。IList 不是一个具…...
助力android面试2024【面试题合集】
转眼间,2023年快过完了。今年作为口罩开放的第一年大家的日子都过的十分艰难,那么想必找工作也不好找,在我们android开发这一行业非常的卷,在各行各业中尤为突出。android虽然不好过,但不能不吃饭吧。卷归卷但是还得干…...
【动态规划】LeetCode-62.不同路径
🎈算法那些事专栏说明:这是一个记录刷题日常的专栏,每个文章标题前都会写明这道题使用的算法。专栏每日计划至少更新1道题目,在这立下Flag🚩 🏠个人主页:Jammingpro 📕专栏链接&…...
对 Vision Transformers 及其基于 CNN-Transformer 的变体的综述
A survey of the Vision Transformers and its CNN-Transformer based Variants 摘要1、介绍2、vit的基本概念2.1 patch嵌入2.2 位置嵌入2.2.1 绝对位置嵌入(APE)2.2.2 相对位置嵌入(RPE)2.2.3卷积位置嵌入(CPE) 2.3 注意力机制2.3.1多头自我注意(MSA) 2.4 Transformer层2.4.1 …...
MongoDB简介
数据库,顾名思义,是保存数据的地方。中华文化博大精深,短短3个文字,就定义了一个强大的数据管理和读写方式出来。数据库,管理的对象是数据。称为库,表示数据在库中有组织,相互之间有微妙的关系。…...
尚硅谷hadoop3.x课程部分资料文件下载,jdk,hadoopjar包
jdk文件百度云下载: 链接:https://pan.baidu.com/s/1MCiGRzOZY8rAFpRJwA3tdw 提取码:kphl hadoop的jar包: 最新版官网链接: Index of /dist/hadoop/core/stable (apache.org) 百度云下载,3.3.3版…...
vue el-radio-group多选封装及使用
基于Element UI库的Vue组件,实现了一个单选/多选框组合的效果,可以根据 type 属性的不同值来切换单选框(默认)和按钮式单选框/多选框。 创建组件index.vue (src/common-ui/radioGroup/index.vue) <template><el-radio-g…...
Kaggle-水果图像分类银奖项目 pytorch Densenet GoogleNet ResNet101 VGG19
一些原理文章 卷积神经网络基础(卷积,池化,激活,全连接) - 知乎 PyTorch 入门与实践(六)卷积神经网络进阶(DenseNet)_pytorch conv1x1_Skr.B的博客-CSDN博客GoogLeNet网…...
TPLink-Wr702N 通过OpenWrt系统打造打印服务器实现无线打印
最近淘到了一个TPLink-Wr702N路由器,而且里面已经刷机为OpenWrt系统了,刚好家里有一台老的USB打印机,就想这通过路由器将打印机改为无线打印机,一番折腾后,居然成功了,这里记录下实现过程,为后面…...
[UGUI]实现从一个道具栏拖拽一个UI道具到另一个道具栏
在Unity游戏开发中,实现UI道具的拖拽功能是一项常见的需求。本文将详细介绍如何使用Unity的UGUI系统和事件系统,实现从一个道具栏拖拽一个UI道具到另一个道具栏的功能。 一、准备工作 首先,你需要在Unity中创建两个道具栏和一些UI道具。道具…...
微服务--08--Seata XA模式 AT模式
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 分布式事务Seata 1.XA模式1.1.两阶段提交1.2.Seata的XA模型1.3.优缺点 AT模式2.1.Seata的AT模型2.2.流程梳理2.3.AT与XA的区别 分布式事务 > 事务–01—CAP理论…...
Doris 数据导入一:Broker Load 方式
1.Doris导入数据的方式总结 导入(Load)功能就是将用户的原始数据导入到 Doris 中。导入成功后,用户即可通过 Mysql 客户端查询数据。为适配不同的数据导入需求,Doris 系统提供了6种不同的导入方式。每种导入方式支持不同的数据源,存在不同的使用方式(异步,同步)。 所有…...
docker踩坑记录:docker容器创建doris容器间无法通讯问题
背景: 开发大数据平台,使用doris作为数据仓储,使用docker做集群部署,先进行开发环境搭建,环境为BE1;FE1,原来使用官方例子,但是官方例子是创建了一个bridge使用172.20.80.0/24通讯,…...
springboot+java校园自助洗衣机预约系统的分析与设计ssm+jsp
洗衣服是每个人都必须做的事情,而洗衣机更成为了人们常见的电器,但是单个洗衣机价格不菲,如果每人都买,就会造成资源的冗余。所有就出现了公用设备,随着时代的发展,很多公用都开始向着无人看守的自助模式经…...
TCP简介及特性
1. TCP协议简介 TCP是Transmission Control Protocol的简称,中文名是传输控制协议。它是一种面向连接的、可靠的、基于IP的传输层协议。两个TCP应用之间在传输数据的之前必须建立一个TCP连接,TCP采用数据流的形式在网络中传输数据。TCP为了保证报文传输的…...
LeagueAkari:如何用数据驱动你的英雄联盟竞技水平提升
LeagueAkari:如何用数据驱动你的英雄联盟竞技水平提升 【免费下载链接】League-Toolkit An all-in-one toolkit for LeagueClient. Gathering power 🚀. 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit 在英雄联盟这款全球热门的竞…...
GLM-4.1V-9B-Base保姆级教学:Web界面截图+问题输入框最佳实践
GLM-4.1V-9B-Base保姆级教学:Web界面截图问题输入框最佳实践 1. 认识GLM-4.1V-9B-Base GLM-4.1V-9B-Base是智谱开源的视觉多模态理解模型,专门用于处理图像内容识别、场景描述、目标问答和中文视觉理解任务。这个模型已经完成了Web化封装,可…...
大多数人手动给Agent加记忆 Meta HyperAgents却让AI自己发明了完整记忆系统
你是不是也这样造Agent:先搭好任务执行模块,再手动塞一个向量数据库或RAG当记忆,最后发现跨轮迭代时效果还是“每次从零开始”?性能没 compounding,跨任务迁移更是一团乱麻。明明AI已经能自我迭代了,为什么…...
5分钟部署阿里RexUniNLU:Web界面操作,无需编程基础
5分钟部署阿里RexUniNLU:Web界面操作,无需编程基础 1. 认识RexUniNLU:零样本理解的神器 想象一下,你刚接手一个新项目,老板丢给你一堆用户评论,要求你快速分析出大家对产品"屏幕"、"续航&…...
Go Module 依赖冲突调试方法
Go Module 依赖冲突调试方法 在Go语言开发中,依赖管理是一个关键环节。随着项目规模的扩大,依赖的第三方库越来越多,版本冲突问题也愈发常见。Go Module作为官方推荐的依赖管理工具,虽然简化了依赖管理流程,但在多级依…...
Node.js后端服务开发:搭建调用Lingbot-Depth-Pretrain-ViTL-14的API接口
Node.js后端服务开发:搭建调用Lingbot-Depth-Pretrain-ViTL-14的API接口 你是不是遇到过这样的场景:手头有一个很厉害的AI模型,比如能估算图片深度的Lingbot-Depth-Pretrain-ViTL-14,但不知道怎么把它变成一个方便调用的服务&…...
STM32CubeIDE工程复制粘贴保姆级教程:告别重复配置,5分钟搞定新项目
STM32CubeIDE工程复制粘贴保姆级教程:告别重复配置,5分钟搞定新项目 每次启动新项目时,你是否还在重复那些繁琐的初始化步骤?从零开始配置时钟树、外设参数、中断优先级,不仅耗时费力,还容易出错。对于经验…...
从原理到实战:PID位置式、增量式与串级PID的嵌入式实现与调参指南
1. PID控制算法基础:从生活场景理解控制原理 想象一下你正在用淋浴洗澡,发现水温太烫时的自然反应:首先会快速把阀门往冷水方向调(比例控制),如果水温还是偏高,你会持续微调阀门(积分…...
浅谈MIKE URBAN转SWMM的方法
01 前言近期有群友咨询MIKE URBAN怎么转换成SWMM的INP文件格式,其实这个是很简单的,前提是你对两个软件格式足够熟悉,另一方面,很多年前SWMM就开发了inpPNS软件。可以利用这个软件便可实现转换,小编抽时间给大家分享下…...
RTX3070 + CUDA 11.0 实战:手把手教你从零搭建 PointNet.pytorch 环境(附常见报错解决)
RTX3070 CUDA 11.0 实战:手把手教你从零搭建 PointNet.pytorch 环境(附常见报错解决) 当你手握一块RTX3070显卡,想要复现PointNet这一经典点云处理网络时,是否曾被环境配置的各种坑绊住脚步?本文将带你避开…...
