面试准备:排序算法大汇总 C++

排序算法总结

在这里插入图片描述

直接插入排序

取出未排序部分的第一个元素,与已排序的部分从后往前比较,找到合适的位置。将大于它的已排序的元素向后移动,将该元素插入到合适的位置。

//1. 直接插入排序
void InsertionSort(vector<int>& nums){for(int i=1;i<nums.size();i++){int key = nums[i];//取出未排序部分的第一个元素int j =i-1;// 将这个元素与已排序部分的元素从后向前比较,找到合适的位置插入while(j>=0 && nums[j]>key){nums[j+1]=nums[j];// 已排序的元素向后移动j--;}nums[j+1]=key; // 插入到正确位置}
}

希尔排序

希尔排序是一种基于插入排序的算法,通过引入间隔序列来允许交换距离较远的元素,从而对数组进行部分排序,这个过程重复进行,每次都减小间隔,直到整个数组被排序。

//2. 希尔排序,分组后组内进行直接插入排序
void shellSort(vector<int>& nums){int n = nums.size();//gap最初为n/2,然后不断减小直至为1for(int gap = n/2; gap>0 ;gap/=2){for(int i = gap ;i < n; i += 1){//获取未排序的第一个元素int key = nums[i];int j=i-gap;//前一个元素是i-gap;while(j>=0 && nums[j]>key){nums[j+gap]=nums[j];j-=gap;}nums[j+gap]=key;}}
}

冒泡排序

冒泡排序的核心思想是通过重复遍历要排序的列表,比较每对相邻的项,然后交换它们(如果它们是在错误的顺序)。这个过程重复进行,直到没有需要交换的项,这意味着列表已经排序完成。每完成一轮遍历,至少一个元素会被移动到其最终位置。

//3. 冒泡排序
void bubbleSort(vector<int>& nums){int n = nums.size();for(int i=0;i<n-1;i++){   bool flag = false;for(int j=0;j<n-i-1;j++){if(nums[j]>nums[j+1])swap(nums[j],nums[j+1]);flag = true;}if(flag==false) return; //如果这一趟没有发生任何交换,则意味已经有序。}
}

快速排序

快速排序是一种高效的排序算法,采用分治法的思想来对数组进行排序。它的基本步骤是选择一个元素作为基准(pivot),重新排列数组,所有比基准值小的元素摆放在基准前面,所有比基准值大的元素摆在基准的后面(相等的数可以到任一边)。在这个分区退出之后,该基准就处于数组的中间位置。这个过程称为分区(partition)操作。然后,递归地(recursive)把小于基准值元素的子数组和大于基准值元素的子数组排序。

//4. 快速排序
int partition(vector<int>& nums,int low, int high)
{int pivot=nums[low];int i=low;int j=high;while(i<j){// 从右向左找到第一个小于等于pivot的数   while(i<j && nums[j]>pivot){j--;}if(i<j){nums[i]=nums[j];i++;}// 从左向右找到第一个大于pivot的数while(i<j && nums[i]<pivot){i++;}if(i<j){nums[j]=nums[i];j--;}}nums[i]=pivot;// 将基准值放到正确的位置return i; // 返回基准值的位置
}void quickSort(vector<int>& nums, int low, int high){if(low<high){// pi是partitioning index,arr[pi]现在在正确的位置int pi = partition(nums,low,high);// 分区操作,并返回基准值的索引quickSort(nums,low,pi-1);//对左子树进行快速排序quickSort(nums,pi+1,high);//对右子树进行快速排序}}

简单选择排序

简单选择排序是一种直观且基础的排序算法。它的工作原理是:遍历数组,每次从未排序的部分选出最小(或最大)的元素,放到已排序部分的末尾。这个过程重复进行,直到整个数组排序完成。简单选择排序的时间复杂度为O(n^2),在任何情况下都是这样,这使得它在处理大数据集时不够高效。然而,由于其实现简单,它在数据量不大时仍然是一个不错的选择。

// 5. 简单选择排序:找到最小的元素后,和第一个元素交换
void simpleSort(vector<int>& nums)
{for(int i=0;i<nums.size();i++){// 寻找[i, n)区间里的最小值的索引int minindex=i;for(int j=0;i<nums.size();j++){if(nums[j]<nums[minindex]){minindex=j;}}swap(nums[i],nums[minindex]);}
}

堆排序

小根堆的时候是降序排列,大根堆是升序排列。

// 调整根堆,i是要调整的节点索引,n是堆的大小
void heapify(vector<int>& nums, int n, int i) {int smallest = i; // 初始化最小元素为当前节点int left = 2 * i + 1; // 左子节点int right = 2 * i + 2; // 右子节点// 如果左子节点更小,则更新最小元素的索引if (left < n && nums[left] < nums[smallest]) {smallest = left;}// 如果右子节点更小,则更新最小元素的索引if (right < n && nums[right] < nums[smallest]) {smallest = right;}// 如果最小元素不是当前节点,交换它们,并对交换后的节点进行调整if (smallest != i) {swap(nums[i], nums[smallest]);heapify(nums, n, smallest);}
}// 堆排序
void heapSort(vector<int>& nums) {int n = nums.size();//构建小根堆(从最后一个非叶子节点往上,最后一个非叶子节点是n/2-1)for(int i = n/2-1;i>=0;i--){heapify(nums,n,i);}//一个个从小根堆中取出,然后调整堆for(int i=n-1;i>0;i--){swap(nums[0],nums[i]);heapify(nums,i,0);}
}

归并排序

// 7. 归并排序
// 归并两个子数组的函数
// 第一个子数组是 arr[l..m]
// 第二个子数组是 arr[m+1..r]
// 归并排序是一种高效的排序算法,采用分治法的一个应用。
// 它将数组分成两半,对每部分递归地应用归并排序,
// 然后将两部分合并成一个有序数组。
// 这个过程包括分解数组成为越来越小的部分,
// 直至每个小部分只有一个元素,然后开始合并这些小部分,
// 使之有序,最终得到完全排序的数组。
void merge(vector<int>& nums,int l,int m,int r){int i,j,k;int n1=m-l+1;//左边的大小int n2=r-m;//右边的大小// 创建临时数组vector<int> L(n1),R(n2);// 拷贝数据到临时数组L Rfor(int i=0;i<n1;i++)L[i]=nums[l+i];for (j = 0; j < n2; j++)R[j] = nums[m + 1 + j];//归并临时数组到nums[l-r]i=0;j=0;k=l;while(i<n1 && j<n2){if (L[i] <= R[j]) {nums[k] = L[i];i++;} else {nums[k] = R[j];j++;}k++;}// 拷贝 L[] 的剩余元素while (i < n1) {nums[k] = L[i];i++;k++;}// 拷贝 R[] 的剩余元素while (j < n2) {nums[k] = R[j];j++;k++;}}
void mergeSort(vector<int>& nums, int l, int r)
{   if(l<r){int m=l+(r-l)/2;//分别对左右办部分进行排序mergeSort(nums,l,m);mergeSort(nums,m+1,r);//合并这两个部分merge(nums,l,m,r);}}

reference

https://leetcode.cn/circle/discuss/rzsN73/ 排序算法大汇总
https://mp.weixin.qq.com/s/FFsvWXiaZK96PtUg-mmtEw TOPk问题大汇总在这里插入图片描述

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

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

相关文章

Unity 佳能SDK 及数据获取

1. 填写信息跟官方申请SDK,大概1-2个工作日会邮件回复你 佳能(中国)- 佳定制(佳能影像产品),SDK,EDSDK,CCAPI,软件开发包下载 2. 将SDK这两个文件放到 Unity Plugins文件夹 3. 把CameraControl 下面只要是绿色的 .cs 文件都复制到Unity 中

武汉灰京文化:多样化推广与创新引领游戏行业

作为专业的游戏推广服务商&#xff0c;武汉灰京文化注重多样化的推广策略&#xff0c;通过与各大媒体、社交平台和游戏社区建立紧密的合作关系&#xff0c;为游戏企业提供全方位的推广服务。他们通过精确的广告投放、内容创作和社交媒体互动等方式&#xff0c;将游戏信息传播给…

框架漏洞-->Struts2 Docker_Vulnhub搭建

来浅浅的讲一下Struts2漏洞 目录 1.Docker_Vulnhub搭建 2.Struts2 3.Struts2的框架特征 4.S2-029-->Remote Code Execution 5.漏洞复现 1.RCE 2.Getshell 1.Docker_Vulnhub搭建 因为我用的是Linux&#xff0c;所以我选择直接搭个docker&#xff0c;这里我建议先换个…

SpringCloud微服务-统一网关Gateway

统一网关Gateway 文章目录 统一网关Gateway1、为什么需要网关?2、gateway快速入门3、路由断言工厂Route Predicate Factory4、过滤器工厂-路由过滤器GatewayFilter5、全局过滤器**GlobalFilter**6、各种过滤器的执行顺序7、跨域问题的解决 1、为什么需要网关? 网关与各个服务…

模拟队列(数组实现)

题目描述&#xff1a; 代码模板&#xff1a; int q[N],hh,tt -1;//插入操作 void push(int x) {q[tt] x; }//弹出操作 void pop() {hh ; }//判断是否为空 bool empty() {if(hh > tt) return true;else return false; }//返回队首元素 int query() {return q[hh]; }AC代…

【wails】(6):使用wails做桌面应用开发,使用gin+go-chatglm.cpp进行本地模型运行,在windows上运行成功

1&#xff0c;整体架构说明 主要使用&#xff0c;参考的开源项目是&#xff1a; https://github.com/wailsapp/wails 前端项目&#xff1a; https://github.com/Chanzhaoyu/chatgpt-web 运行模型&#xff1a; https://github.com/Weaxs/go-chatglm.cpp 参考代码&#xff1a; h…

React富文本编辑器开发(一)

这是一个系统的完整的教程&#xff0c;每一节文章的内容都很重要。这个教程学完后自己可以开发出一个相当完美的富文本编辑器了。下面就开始我们今天的内容&#xff1a; 安装 是的&#xff0c;我们的开发是基于Slate的开发基础&#xff0c;所以要安装它&#xff1a; yarn ad…

第19章-IPv6基础

1. IPv4的缺陷 2. IPv6的优势 3. 地址格式 3.1 格式 3.2 长度 4. 地址书写压缩 4.1 段内前导0压缩 4.2 全0段压缩 4.3 例子1 4.4 例子 5. 网段划分 5.1 前缀 5.2 接口标识符 5.3 前缀长度 5.4 地址规模分类 6. 地址分类 6.1 单播地址 6.2 组播地址 6.3 任播地址 6.4 例子 …

5GC SBA架构

协议标准&#xff1a;Directory Listing /ftp/Specs/archive/23_series/23.501/ (3gpp.org) NF描述说明NSSFNetwork Slice Selection Function网络切片选择&#xff0c;根据UE的切片选择辅助信息、签约信息等确定UE允许接入的网络切片实例。NEF Network Exposure Function网络开…

在vue2中使用饼状图

1.引入vue2和echarts <script src"https://cdn.jsdelivr.net/npm/vue2.7.14/dist/vue.js"></script> <script src"https://cdn.jsdelivr.net/npm/echarts5.4.0/dist/echarts.min.js"></script> 2.1 补充基本的body内容 <div id…

Vue开发实例(七)Axios的安装与使用

说明&#xff1a; 如果只是在前端&#xff0c;axios常常需要结合mockjs使用&#xff0c;如果是前后端分离&#xff0c;就需要调用对应的接口&#xff0c;获取参数&#xff0c;传递参数&#xff1b;由于此文章只涉及前端&#xff0c;所以我们需要结合mockjs使用&#xff1b;由于…

智慧公厕:让城市更智慧、更环保

在现代社会&#xff0c;智慧公厕作为城市管理的重要一环&#xff0c;是智慧城市的重要组成部分&#xff0c;其建设的价值十出突出&#xff0c;是公共厕所信息化升级改造的核心方案。如智慧公厕源头厂家广州中期科技有限公司&#xff0c;所自主研发的智慧公厕整体解决方案&#…

docker-mysql:5.7安装

1、下载mysql:5.7镜像 [rootlocalhost ~]# docker search mysql (某个XXX镜像名字) [rootlocalhost ~]# docker pull mysql:5.7 按装之前查看一下是否按装过mysql。如果安装过会占用3306端口。 [rootlocalhost ~]# ps -ef | grep mysql 2、安装 # -d&#xff1a;后台运行 #…

VL817-Q7 USB3.0 HUB芯片 适用于扩展坞 工控机 显示器

VL817-Q7 USB3.1 GEN1 HUB芯片 VL817-Q7 USB3.1 GEN1 HUB芯片 VIA Lab的VL817是一款现代USB 3.1 Gen 1集线器控制器&#xff0c;具有优化的成本结构和完全符合USB标准3.1 Gen 1规范&#xff0c;包括ecn和2017年1月的合规性测试更新。VL817提供双端口和双端口4端口配置&…

Go 互斥锁的实现原理?

Go sync包提供了两种锁类型&#xff1a;互斥锁sync.Mutex 和 读写互斥锁sync.RWMutex&#xff0c;都属于悲观锁。 概念 Mutex是互斥锁&#xff0c;当一个 goroutine 获得了锁后&#xff0c;其他 goroutine 不能获取锁&#xff08;只能存在一个写者或读者&#xff0c;不能同时…

数据抽取平台pydatax介绍--实现和项目使用

数据抽取平台pydatax实现过程中&#xff0c;有2个关键点&#xff1a; 1、是否能在python3中调用执行datax任务&#xff0c;自己测试了一下可以&#xff0c;代码如下&#xff1a; 这个str1就是配置的shell文件 try:result os.popen(str1).read() except Exception as …

Vue2:用node+express部署Vue项目

一、编译项目 命令 npm run build执行命令后&#xff0c;我们会在项目文件夹中看到如下生成的文件 二、部署Vue项目 接上一篇&#xff0c;nodeexpress编写轻量级服务 1、在demo中创建static文件夹 2、将dist目录中的文件放入static中 3、修改server.js文件 关键配置&…

【EAI 026】RoboGen: 通过自动数据生成管线实现机器人技能学习

Paper Card 论文标题&#xff1a;RoboGen: Towards Unleashing Infinite Data for Automated Robot Learning via Generative Simulation 论文作者&#xff1a;Yufei Wang, Zhou Xian, Feng Chen, Tsun-Hsuan Wang, Yian Wang, Zackory Erickson, David Held, Chuang Gan 作者单…

2.26 Qt day4+5 纯净窗口移动+绘画事件+Qt实现TCP连接服务+Qt实现连接数据库

思维导图 Qt实现TCP连接 服务器端&#xff1a; widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include<QTcpServer>//服务器端类 #include<QTcpSocket>//客户端类 #include<QMessageBox>//消息对话框类 #include<QList>//链…

笔记72:关于IMU(惯性测量单元)传感器的作用【不涉及公式推导】

一、IMU传感器是什么&#xff1a; 惯性测量单元IMU&#xff08;Inertial Measurement Unit&#xff09;是一种使用【加速度计】和【陀螺仪】来测量【物体三轴姿态角&#xff08;空间姿态&#xff09;】的装置&#xff1b;IMU在坐标系的每个坐标轴上&#xff0c;均安装有1个陀螺…