排序算法——梳理总结

✨冒泡
✨选择
✨插入
 ✨标准写法
 🎭不同写法
✨希尔排序——标准写法
✨快排
✨归并
✨堆排

在这里插入图片描述

冒泡

在这里插入图片描述

void Bubble(vector<int>& nums)
{// 冒泡排序只能先确定最右边的结果,不能先确定最左边的结果for (int i = 0; i < nums.size(); i++){// 确定的右边的就不用排了并且不能让j+1越界// 所以判断条件是nums.size()-i - 1for (int j = 0; j < nums.size()-i - 1; j++)if (nums[j] > nums[j + 1])swap(nums[j], nums[j + 1]);}
}

选择

选择排序重要的是选,先选出来,再将这个数交换进去
在这里插入图片描述

void Select(vector<int>& nums)
{for (int i = 0; i < nums.size(); i++){int t = i;// 记录需要交换的数的位置for (int j = i + 1; j < nums.size(); j++)if (nums[t] > nums[j])t = j;swap(nums[t], nums[i]);}
}

插入

在这里插入图片描述

标准写法

插入排序是一个一个往后挪,最后再插入

void Insert(vector<int>& nums)
{for (int i = 0; i < nums.size(); i++){int t = nums[i];// 注意j表示需要检查的位置,这个位置必须遵循j>=0for (int j =i-1; j >= 0; j--){if (nums[j] > t)nums[j + 1] = nums[j];else{nums[j + 1] = t;break;}}}
}

注意j的范围

🎭不同写法

这种写法类似于冒泡排序,他是往前冒,虽然能对,但是这已经不是插入排序的思想

int* sortArray(int* nums, int numsSize, int* returnSize)
{//插入排序:在已经排好序的数组中进行插入*returnSize=numsSize;for(int i=0;i<numsSize;i++){//从此位置向前比for(int j=i;j>0;j--){if(nums[j]<nums[j-1]){int tem=nums[j];nums[j]=nums[j-1];nums[j-1]=tem;}elsebreak;}}return nums;
}

希尔——标准写法

在这里插入图片描述

希尔排序是在插入排序的基础上发展而来,所以要遵循插入排序的逻辑
他和插入排序不同在于,插入排序的gap=1,这个gap是从大到小变化

void Shell(vector<int>& nums)
{for (int gap = nums.size()/2; gap >0; gap/=2)// 间隔	{//每次向后跳间隔个长度for (int i = 0; i < nums.size(); i++) {int t = nums[i];// 注意j的范围for (int j = i-gap; j >= 0; j -= gap){if (nums[j] > t)nums[j + gap] = nums[j];else{nums[j + gap] = t;break;}}}}
}

注意j的范围


快排

我们使用三段式进行排序
[l,left] [left+1,right-1] [right,r]
[l,left]——小于key
[left + 1 , right-1]—— 等于key,等于key的是不用排序
[right , r]——大于key

int getNum(vector<int>& nums, int l, int r)
{srand(time(nullptr));return nums[l + rand() % (r - l + 1)];
}
void quicksort(vector<int>& nums, int l, int r)
{if (l >= r) return;int key = getNum(nums, l, r);int left = l - 1, right = r + 1, g = l;// 采用三段式进行while (g < right){if (nums[g] == key) g++;else if (nums[g] < key) swap(nums[g++], nums[++left]);else swap(nums[g], nums[--right]);}// [l,left][left+1,right-1][right,r]quicksort(nums, l, left), quicksort(nums, right, r);
}

归并

归并排序需要一个辅助数组,我们使用的是vector,使用之前需要进行resize,开足够大的空间的同时要运行进行随机访问

vector<int> tem;
void mergesort(vector<int>& nums, int l, int r)
{if (l >= r) return;int mid = l + r >> 1;mergesort(nums, l, mid), mergesort(nums, mid + 1, r);int left = l, right = mid + 1;int t = 0;while (left <= mid && right <= r){if (nums[left] < nums[right]) tem[t++] = nums[left++];else tem[t++] = nums[right++];}while (left <= mid) tem[t++] = nums[left++];while (right <= r) tem[t++] = nums[right++];t = 0;left = l;while (left <= r) nums[left++] = tem[t++];
}

堆排

void up(vector<int>& nums,int t)
{while (t > 0){int parent = (t - 1) / 2;// 大根堆if (nums[parent] < nums[t])swap(nums[parent], nums[t]);t = parent;}
}
void down(vector<int>& nums,int t)
{// 需要从这个位置开始向下down到底int child = t * 2 + 1;while (child < nums.size()){// 找到左右孩子中最小的位置//if (child + 1 < nums.size() && nums[child] > nums[child + 1])//	child++;//if(nums[t]>nums[child]) //	swap(nums[t], nums[child]);if (child + 1 < nums.size() && nums[child] < nums[child + 1]) child++;if (nums[t] < nums[child])swap(nums[t], nums[child]);t = child;child = t * 2 + 1;}
}
void Heap(vector<int>& nums)
{//筛选法建立初始堆——小大根堆都可以//for (int i = nums.size()/2; i >= 0; i--) down(nums, i);//for (int i = 0 ; i < nums.size(); i++) up(nums, i);// 如果想用up初始化堆,只能从头开始
}
  1. 筛选法建堆——先将所有数据加入构成堆,在从中间位置开始进行down(只能down,不论是建大堆还是小堆)
    什么时候使用up,为什么up不能在筛选法建堆中使用
    请添加图片描述
    就像上图中的情况,在建小堆的过程中,2是一定不能访问到的,就不能建成小堆,所以不能在筛选法中使用up(关键是筛选法起点是中间位置)
    如果想使用up,必须将每一个进行up,或者是某个位置上面的已经成堆,那么就可以在这个位置直接使用up
    对于down来说,如果某个位置下面已经成堆,那么就可以直接使用down

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

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

相关文章

基于深度学习的交通标志检测识别系统(含UI界面、yolov8、Python代码、数据集)

项目介绍 项目中所用到的算法模型和数据集等信息如下&#xff1a; 算法模型&#xff1a;     yolov8 yolov8主要包含以下几种创新&#xff1a;         1. 添加注意力机制&#xff08;SE、CBAM等&#xff09;         2. 修改可变形卷积&#xff08;DySnake-主干c…

linux系统命令深入研究1——ls的参数

ls list命令有一些常用的参数&#xff0c;其中-a意为列出all全部文件&#xff08;包括隐藏文件&#xff09;&#xff0c;-l列出详细信息&#xff0c;-h以人类可阅读的方式列出文件大小 --full-time是列出详细时间信息&#xff0c;包括最后一次修改时间 -t是按时间排序&#xff…

课时57:数组实践_综合实践_数组案例

1.2.2 数组案例 学习目标 这一节&#xff0c;我们从 信息统计、服务管理、小结 三个方面来学习。 信息统计 需求 分别打印CPU 1min 5min 15min load负载值 命令提示&#xff1a;uptime信息显示&#xff1a;CPU 1 min平均负载为: 0.00CPU 5 min平均负载为: 0.01CPU 15 min平…

Git 内幕探索:从底层文件系统到历史编辑的全面指南

微信搜索“好朋友乐平”关注公众号。 1. Git 底层文件对象 #mermaid-svg-uTkvyr26fNmajZ3n {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-uTkvyr26fNmajZ3n .error-icon{fill:#552222;}#mermaid-svg-uTkvyr26fNmaj…

Spark实战-基于Spark日志清洗与数据统计以及Zeppelin使用

Saprk-日志实战 一、用户行为日志 1.概念 用户每次访问网站时所有的行为日志(访问、浏览、搜索、点击)用户行为轨迹&#xff0c;流量日志2.原因 分析日志&#xff1a;网站页面访问量网站的粘性推荐3.生产渠道 (1)Nginx(2)Ajax4.日志内容 日志数据内容&#xff1a;1.访问的…

每天学习一个Linux命令之chown

每天学习一个Linux命令之chown 在Linux系统中&#xff0c;chown命令用于更改文件或目录的所有者。通常情况下&#xff0c;只有超级用户root和文件所有者本人可以使用chown命令。在这篇博客中&#xff0c;我们将详细介绍chown命令的用法以及所有可用的选项。 1. 命令格式 bas…

【动态规划】完全背包

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;题目解析 &#x1f30e;推荐文章&#xff1a;【LeetCode】winter vacation training 目录 &#x1f449;&#x1f3fb;完全背包 &#x1f449;&#x1f3fb;…

政安晨:【深度学习处理实践】(二)—— 最大汇聚运算

最大汇聚运算&#xff08;Max Pooling Operation&#xff09;是深度学习领域卷积神经网络常用的一种汇聚运算方式。在卷积神经网络中&#xff0c;经过一系列卷积层和激活函数层后&#xff0c;数据在空间尺寸上逐渐减小&#xff0c;特征图的深度也逐渐增加。为了降低数据尺寸并提…

微信小程序(五十三)修改用户头像与昵称

注释很详细&#xff0c;直接上代码 上一篇 新增内容&#xff1a; 1.外界面个人资料基本模块 2.资料修改界面同步问题实现&#xff08;细节挺多&#xff0c;考虑了后期转服务器端的方便之处&#xff09; 源码&#xff1a; app.json {"window": {},"usingCompone…

算法打卡day11|栈与队列篇03|Leetcode 239. 滑动窗口最大值、347.前 K 个高频元素

小顶堆和大顶堆 小顶堆&#xff08;Min Heap&#xff09;和大顶堆&#xff08;Max Heap&#xff09;是两种特殊的完全二叉树&#xff0c;它们遵循特定的堆属性&#xff0c;即父节点的值总是小于或等于&#xff08;小顶堆&#xff09;或者大于或等于&#xff08;大顶堆&#xf…

Spring AOP相关注解及执行顺序

Aspect&#xff08;切面&#xff09;&#xff1a;用于标识一个类是切面的注解。通常与其他通知注解一起使用&#xff0c;定义切面类。 Pointcut&#xff08;切点&#xff09;&#xff1a; 注解来定义切点&#xff0c;它用于描述哪些连接点将会被通知所通知。 连接点&#xff…

Linux minfo命令教程:详解MS-DOS文件系统参数查看命令(附实例详解和注意事项)

Linux minfo命令介绍 minfo命令用于显示MS-DOS文件系统的各项参数&#xff0c;如磁区数、磁头数和柱面数等。它还可以打印一个mformat命令行&#xff0c;该命令行可以用于在其他媒体上创建类似的MS-DOS文件系统。 Linux minfo命令适用的Linux版本 minfo命令在大多数Linux发行…

算法D39 | 动态规划2 | 62.不同路径 63. 不同路径 II

今天开始逐渐有 dp的感觉了&#xff0c;题目不多&#xff0c;就两个 不同路径&#xff0c;可以好好研究一下 62.不同路径 本题大家掌握动态规划的方法就可以。 数论方法 有点非主流&#xff0c;很难想到。 代码随想录 视频讲解&#xff1a;动态规划中如何初始化很重要&#x…

Latex公式太长换行标号

Latex中公式太长换行&#xff0c;且编号&#xff0c;可以采用align&#xff0c;不编号行公式用\nonumber&#xff0c;示例如下&#xff1a; \begin{align}\nonumber %第1行公式不编号&abababababababa\\&cdm %第2行公式编号 \end{align}效果如下 原文件链接 公式不…

清除Mac OS上Xcode占用的空间

最近自己的Mac OS存储空间严重不足&#xff0c;想了一下&#xff0c;大概是从安装 Xcode 之后出现&#xff0c;在系统下通过 du 命令分析各目录大小&#xff0c;发现大概下面几个目录占用空间比较大&#xff0c;所以针对这几个名目录作了一下清理&#xff0c;释放了几十个G的空…

Leetcode 268 火星词典

题目描述&#xff1a; 现有一种使用英语字母的火星语言&#xff0c;这门语言的字母顺序与英语顺序不同。 给你一个字符串列表 words &#xff0c;作为这门语言的词典&#xff0c;words 中的字符串已经 按这门新语言的字母顺序进行了排序 。 请你根据该词典还原出此语言中已知…

<网络安全>《65 微课堂<第6课 网间文件安全交换系统>》

1 5中文件传输方式 1.1 通过U盘、硬盘、光盘等硬件介质传输 优势是成本低。 劣势是1、无法对这个行为过程进行监控管理。2、大文件较大、高频率交换时需要专人负责。3、由于这个过程并没有杀毒、内容检测等环节&#xff0c;因此具有较大的安全风险。 1.2 FTP、SFTP等跨网传输…

WordPress建站入门教程:如何上传安装WordPress主题?

我们成功搭建WordPress网站后&#xff0c;默认使用的是自带的最新主题&#xff0c;但是这个是国外主题&#xff0c;可能会引用一些国外的资源文件&#xff0c;所以为了让我们的WordPress网站访问速度更快&#xff0c;强烈建议大家使用国产优秀的WordPress主题。 今天boke112百…

【C语言】球球大作战

前言&#xff1a; 这款简易版的球球大作战是一款单人游戏&#xff0c;玩家需要控制一个小球在地图上移动&#xff0c;吞噬其他小球来增大自己的体积。本游戏使用C语言和easyx图形库编写&#xff0c;旨在帮助初学者了解游戏开发的基本概念和技巧。 在开始编写代码之前&#xf…

Flutter中TextFormField的属性及使用详解

在Flutter中&#xff0c;TextFormField是一个常用的组件&#xff0c;用于接收用户的文本输入。它具有丰富的属性&#xff0c;可以用于实现各种输入框的需求。在本篇博客中&#xff0c;我们将详细介绍TextFormField的属性以及如何使用它来创建文本输入框。 1. 属性介绍 下面是…