C++ OJ题测试—排序算法效率

 

目录

OJ链接

一、直接插入排序

二、希尔排序

三、直接选择排序

常规: 

 第二种:

四、 堆排序

五、冒泡排序

六、快速排序

常规:

三路划分优化效率

七、归并排序

八、计数排序


OJ链接

 

一、直接插入排序

class Solution {
public:vector<int> sortArray(vector<int>& nums) {for(int i=0;i<nums.size()-1;i++){int end=i;int tmp=nums[i+1];while(end>=0){if(nums[end]>tmp){nums[end+1]=nums[end];--end;}elsebreak;}nums[end+1]=tmp;}return nums;}
};

 

二、希尔排序

class Solution {
public:vector<int> sortArray(vector<int>& nums) {int gap=nums.size();while(gap>1){gap=gap/3+1;for(int i=0;i<nums.size()-gap;i++){int end=i;int tmp=nums[end+gap];while(end>=0){if(nums[end]>tmp){nums[end+gap]=nums[end];end-=gap;}elsebreak;}nums[end+gap]=tmp;}}return nums;}
};

三、直接选择排序

常规: 

class Solution {
public:vector<int> sortArray(vector<int>& nums) {int i,j,minIndex,temp;for(i=0;i<nums.size()-1;i++){minIndex=i;for(j=i+1;j<nums.size();j++){if(nums[j]<nums[minIndex])minIndex=j;}temp=nums[i];nums[i]=nums[minIndex];nums[minIndex]=temp;}return nums;}
};

 

 第二种:

class Solution {
public:vector<int> sortArray(vector<int>& nums) {int begin=0,end=nums.size()-1;while(begin<end){int maxi=begin,mini=begin;for(int i=begin;i<=end;i++){if(nums[i]>nums[maxi])maxi=i;if(nums[i]<nums[mini])mini=i;}swap(nums[begin],nums[mini]);if(begin==maxi)maxi=mini;swap(nums[maxi],nums[end]);++begin;--end;}return nums;}
};

四、 堆排序

class Solution {
public:void AdjustDown(vector<int>& a,int n,int parent){int child=parent*2+1;while(child<n){if(child+1<n&&a[child+1]>a[child])++child;if(a[child]>a[parent]){swap(a[child],a[parent]);parent=child;child=parent*2+1;}else{break;}}}vector<int> sortArray(vector<int>& nums) {for(int i=(nums.size()-1-1);i>=0;i--){AdjustDown(nums,nums.size(),i);}int end=nums.size()-1;while(end>0){swap(nums[0],nums[end]);AdjustDown(nums,end,0);--end;}return nums;}
};

 

五、冒泡排序

class Solution {
public:vector<int> sortArray(vector<int>& nums) {for (int j = 0; j < nums.size(); ++j){bool exchange = false;for (int i = 1; i < nums.size() - j; i++){if (nums[i - 1] > nums[i]){int tmp = nums[i];nums[i] = nums[i - 1];nums[i - 1] = tmp;exchange = true;}}if (exchange == false){break;}}return nums;}
};

六、快速排序

常规:

class Solution {
public:int GetMidIndex(vector<int>& a, int left, int right){int mid = (left + right) >> 1;if (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] < a[right]){return right;}else{return left;}}else // a[left] > a[mid]{if (a[mid] > a[right]){return mid;}else if (a[left] > a[right]){return right;}else{return left;}}}void QuickSort(vector<int>& a, int begin, int end){if (begin >= end)return;int keyi = PartSort3(a, begin, end);QuickSort(a, begin, keyi - 1);QuickSort(a, keyi + 1, end);}int PartSort3(vector<int>& a, int left, int right){int midi = GetMidIndex(a, left, right);swap(a[left], a[midi]);int prev = left;int cur = left + 1;int keyi = left;while (cur <= right){if (a[cur] < a[keyi] && ++prev != cur){swap(a[prev], a[cur]);}++cur;}swap(a[prev], a[keyi]);keyi = prev;return keyi;}vector<int> sortArray(vector<int>& nums) {QuickSort(nums,0,nums.size()-1);return nums;}
};

 

三路划分优化效率

 

class Solution {
public:int GetMidIndex(vector<int>& a, int left, int right){int mid = left + (rand()%(right-left));if (a[left] < a[mid]){if (a[mid] < a[right]){return mid;}else if (a[left] < a[right]){return right;}else{return left;}}else // a[left] > a[mid]{if (a[mid] > a[right]){return mid;}else if (a[left] > a[right]){return right;}else{return left;}}}void QuickSort(vector<int>& a, int begin, int end){if (begin >= end)return;int left = begin;int right = end;int cur = left + 1;int midi = GetMidIndex(a, left, right);swap(a[left], a[midi]);int key = a[left];while (cur <= right){if (a[cur] < key){swap(a[left], a[cur]);++left;++cur;}else if (a[cur] > key){swap(a[right], a[cur]);--right;}else{++cur;}}QuickSort(a, begin, left - 1);QuickSort(a, right + 1, end);}vector<int> sortArray(vector<int>& nums){srand(time(0));QuickSort(nums, 0, nums.size() - 1);return nums;}
};
  1.  GetMidIndex:这个方法用于在快速排序的过程中选择一个"基准"元素。它首先随机选择一个索引mid,然后比较数组aleftmidright这三个位置的元素,返回这三个元素中的中位数的索引。这种方式可以有效地避免在处理近乎有序的数组时,快速排序退化为O(n^2)的情况。
  2. QuickSort:这是快速排序的主要方法。它首先调用GetMidIndex方法获取基准元素的索引,然后将基准元素与数组的第一个元素交换位置,接着遍历数组,将小于基准的元素放到左边,大于基准的元素放到右边,等于基准的元素不动。最后,递归地对基准元素左边和右边的子数组进行同样的操作。 

  3. sortArray:这是对外的接口方法,它首先初始化随机数种子,然后调用QuickSort方法对输入的数组nums进行排序,最后返回排序后的数组。

这段代码的主要优点是它使用了随机化的快速排序算法,可以在平均情况下达到O(n log n)的时间复杂度,而且它的空间复杂度为O(log n),因为它只需要递归调用栈的空间。

七、归并排序

class Solution {
public:void InsertSort(vector<int>& a, int begin, int end){for(int i=begin+1; i<=end; i++){int tmp=a[i];int j=i;while(j>begin && a[j-1]>tmp){a[j]=a[j-1];j--;}a[j]=tmp;}}void _MergeSort(vector<int>& a,int begin,int end,vector<int>& tmp){if (begin >= end) {return;}if (end - begin + 1 < 10){InsertSort(a, begin, end);return;}int mid=(begin+end)/2;_MergeSort(a,begin,mid,tmp);_MergeSort(a,mid+1,end,tmp);int begin1=begin,end1=mid;int begin2=mid+1,end2=end;int i=begin;while(begin1<=end1&&begin2<=end2){if(a[begin1]<a[begin2])tmp[i++]=a[begin1++];elsetmp[i++]=a[begin2++];}while(begin1<=end1)tmp[i++]=a[begin1++];while(begin2<=end2)tmp[i++]=a[begin2++];for (i = begin; i <= end; i++){a[i] = tmp[i];}}vector<int> sortArray(vector<int>& nums){vector<int> tmp(nums.size());_MergeSort(nums,0,nums.size()-1,tmp);return nums;}
};

八、计数排序

class Solution {
public:vector<int> sortArray(vector<int>& nums){// 找到数组中的最大值和最小值int minVal = INT_MAX, maxVal = INT_MIN;for (int num : nums) {minVal = min(minVal, num);maxVal = max(maxVal, num);}// 统计每个元素出现的次数vector<int> count(maxVal - minVal + 1, 0);for (int num : nums) {count[num - minVal]++;}// 根据统计结果重新构造排序后的数组vector<int> sortedArray;for (int i = 0; i < count.size(); i++) {for (int j = 0; j < count[i]; j++) {sortedArray.push_back(i + minVal);}}return sortedArray;}
};
  • 当我们使用计数排序算法时,我们首先需要找到待排序数组中的最大值和最小值。这是为了确定计数数组的大小,以及后续构造排序后的数组时的索引范围。
  • 接下来,我们创建一个计数数组 count,其大小为 maxVal - minVal + 1,其中 maxVal 是数组中的最大值,minVal 是数组中的最小值。计数数组用于统计每个元素出现的次数。
  • 然后,我们遍历待排序数组 nums,对于每个元素 num,我们将其在计数数组中对应的位置的值加1,表示该元素出现了一次。
  • 接着,我们根据统计结果重新构造排序后的数组 sortedArray。我们从计数数组的第一个位置开始遍历,对于每个计数数组的索引 i,我们将其对应的值 count[i] 表示的元素值(即 i + minVal)按照出现次数依次添加到 sortedArray 中。
  • 最后,我们返回排序后的数组 sortedArray

计数排序算法的时间复杂度为 O(n+k),其中 n 是待排序数组的长度,k 是待排序元素的范围。由于计数排序是一种稳定的排序算法,它可以在线性时间内完成排序。

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

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

相关文章

CentOS 7 部署 Nacos-2.3.0 (单机版)

CentOS 7 部署 Nacos-2.3.0 &#xff08;单机版&#xff09; 1. 下载 Nacos 安装包 历史版本&#xff1a;https://github.com/alibaba/nacos/releases/ 我选的是 2.3.0 版本&#xff0c;https://github.com/alibaba/nacos/releases/download/2.3.0/nacos-server-2.3.0.tar.g…

等保二级和三级的区别

等保二级和三级定级标准有什么区别&#xff1f;定级原则和方法介绍 网络安全等级保护&#xff0c;简称等保&#xff0c;是我国为了保障信息系统的安全运行&#xff0c;防止信息泄露、篡改、破坏等威胁&#xff0c;制定的一套信息安全管理制度。根据《信息安全技术网络安全等级保…

MIT18.06线性代数 笔记1

文章目录 方程组的几何解释矩阵消元乘法和逆矩阵A的LU分解转置-置换-向量空间R列空间和零空间求解Ax0主变量 特解求解Axb可解性和解的结构线性相关性、基、维数四个基本子空间矩阵空间、秩1矩阵和小世界图图和网络复习一 方程组的几何解释 线性组合&#xff1a; 找到合适的x和…

【小沐学Python】Python实现语音识别(vosk)

文章目录 1、简介1.1 vosk简介1.2 vosk模型1.3 vosk服务 2、安装3、测试3.1 命令行测试3.2 代码测试 结语 1、简介 https://alphacephei.com/vosk/index.zh.html Vosk 是一个语音识别工具包。 1.1 vosk简介 支持二十种语言 - 中文&#xff0c;英语&#xff0c;印度英语&#…

ansible模块 (7-13)

模块 7、hostname模块&#xff1a; 远程主机名管理模块 ansible 192.168.10.202 -m hostname -a nameliu 8、copy模块&#xff1a; 用于复制指定的主机文件到远程主机的模块 常用参数&#xff1a; dest: 指出要复制的文件在哪&#xff0c;必须使用绝对路径。如果源目标是…

Ubuntu18.04.6下samba服务的安装及配置

目录 01 安装samba服务&#xff1a; 03 重启samba服务 04 设置samba登录密码 05 测试 前言 从本章开始我们将要学习嵌入式音视频的学习了 &#xff0c;使用的瑞芯微的开发板 &#x1f3ac; 个人主页&#xff1a;ChenPi &#x1f43b;推荐专栏1: 《C_ChenPi的博客-CSDN博…

JavaWeb笔记之JavaWeb JDBC

//Author 流云 //Version 1.0 一. 引言 1.1 如何操作数据库 使用客户端工具访问数据库&#xff0c;需要手工建立连接&#xff0c;输入用户名和密码登录&#xff0c;编写 SQL 语句&#xff0c;点击执行&#xff0c;查看操作结果&#xff08;结果集或受影响行数&#xff09;。…

HarmonyOS应用开发-手写板(二)

在前一篇手写板的文章中&#xff08;HarmonyOS应用开发-手写板-CSDN博客&#xff09;&#xff0c;我们通过使用Path实现了一个基本的手写板&#xff0c;但遗憾的是&#xff0c;无法保存所绘制的图像。在本文中&#xff0c;我们将采用canvas和Path2D来重新构建手写板应用。依然只…

java中基本类型之间的转换

基本类型容量 java中的 8 种基本数据类型&#xff0c;以及它们的占内存的容量大小和表示的范围 byte&#xff1a;字节型&#xff0c;占内存容量为 1 个字节&#xff08;8 位&#xff09;&#xff0c;表示范围为 -128&#xff08;-2^7&#xff09;到 127&#xff08;2^7-1&…

关于MQ,你了解多少?(干货分享之一)

导语 本文梳理笔者 MQ 知识&#xff0c;从消息中间件的基础知识讲起&#xff0c;在有了基础知识后&#xff0c;对市面上各主流的消息中间件进行详细的解析&#xff0c;包括 RabbitMQ、RocketMQ、Kafka、Pulsar&#xff0c;最后再横向对比这几款主流的消息中间件。 消息中间件…

Linux下搭建Redis一主二从的哨兵模式

一、Redis哨兵模式搭建 1、准备好三台机器&#xff0c;使用diap用户完成搭建 2、安装Redis -在资源库中下载redis-7.0.8.tar.gz&#xff0c;分别上传到三台服务器中软件安装的目录&#xff0c;我这里安装到/u01下 -安装依赖。yum -y install gcc-c&#xff08;root用户执行…

vue onlyoffice在线编辑与预览,文件无法保存问题,始终打开同一文件的问题

主要写一下前端vue的使用&#xff0c;需要后端或运维去弄docker服务&#xff0c;然后给前端一个api地址 在vue的Index.html页面添加这个 <script type"text/javascript" src"http://docker服务器ip:docker服务器端口/web-apps/apps/api/documents/api.js&q…

智能优化算法应用:基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于鼠群算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.鼠群算法4.实验参数设定5.算法结果6.参考文献7.MA…

【网络安全】—Shell编程入门(1)

文章目录 基础变量概念介绍特殊变量进阶数值计算实践条件测试比较条件判断语句流程控制语句循环语句应用 Shell 是 Unix/Linux 操作系统下的一种命令行解释器&#xff0c;它接收用户输入的命令然后调用相应的程序。我们可以通过 Shell 脚本来自动执行一系列的命令。接下来&…

Logback简介与配置详解

在开发和维护Spring Boot应用程序时&#xff0c;一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback&#xff0c;一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。 Logback简介 官方网址&#xff1a;https://logback.qos.ch/ …

【C++进阶】继承

一、继承的基本概念及定义 1.1 继承的概念 继承的本质是代码的复用 比如&#xff1a; 学校的师生管理系统 有学生、老师、宿管阿姨等 每个人都有的信息名字、电话 身份证号、年龄、性别等 我们可以发现有些类型是具有共性的 如果每个类都去写&#xff0c;初始化时每个 都要初…

Vault实战(一)-Vault介绍

1 Vault介绍 Vault 是一个基于身份的秘密和加密管理系统。秘密是您想要严格控制访问的任何内容&#xff0c;例如 API 加密密钥、密码和证书。 Vault 提供由身份验证和授权方法控制的加密服务。使用 Vault 的 UI、CLI 或 HTTP API&#xff0c;可以安全地存储和管理、严格控制&a…

FPGA 实现 LeNet-5 卷积神经网络 数字识别,提供工程源码和技术支持

目录 1、前言LeNet-5简洁基于Zynq7020 的设计说明PL 端 FPGA 逻辑设计PS 端 SDK 软件设计免责声明 2、相关方案推荐卷积神经网络解决方案FPGA图像处理方案 3、详细设计方案PL端&#xff1a;ov7725摄像头及图像采集PL端&#xff1a;图像预处理PL端&#xff1a;Xilinx推荐的图像缓…

ASO优化实践经验和改进措施

在积累了大量的实战经验后&#xff0c;小柚总结了一些关于ASO优化的经验给大家分享。共同进步&#xff01;共同学习&#xff01;Fighting&#xff01; 一、关键词研究 关键词研究是ASO优化的基础。在进行关键词研究时&#xff0c;需要了解用户搜索意图、关键词竞争情况和关键…

1265. 数星星(树状数组/蓝桥杯)

题目&#xff1a; 输入样例&#xff1a; 5 1 1 5 1 7 1 3 3 5 5输出样例&#xff1a; 1 2 1 1 0 思路&#xff1a; 树状数组 代码&#xff1a; #include<cstdio> #include<iostream> using namespace std; const int N32010; int n; int tr[N],level[N];int lo…