当前位置: 首页 > news >正文

优选算法_分治_快速排序_归并排序_C++

一.题目解析

我们不使用内置的函数进行升序,并且时间复杂度是O(nlog(n))

随机数的取值

我们不选中间值等的取值方法,完全随机取值效率更好,证明略

srand(time(NULL));//随机数种子 int getrandom(vector<int>& nums,int l,int r) { return nums[rand()%(r-l+1)+l]; }

算法一解析:分三组快速排序

选定一个关键数字key分为三组小于key的区间,等于key的区间,大于key的区间

怎么分呢?

再对左右区间进行排序,排序方法和第一步一样也就是递归实现,跟着代码走思路更加清晰

代码编写:

class Solution { public: vector<int> sortArray(vector<int>& nums) { srand(time(NULL));//随机数种子 int n=nums.size(); qsort(nums,0,n-1); return nums; } void qsort(vector<int>& nums,int l,int r) { if(l>=r)return ;//递归出口 int i=l,left=l-1,right=r+1; int key=getrandom(nums,l,r); while(i<right) { if(nums[i]<key) swap(nums[i++],nums[++left]); else if(nums[i]==key) i++; else swap(nums[i],nums[--right]); } //现在数组就分为了三组[l,left][left+1,right-1][right.r] qsort(nums,l,left);//左区间排序 qsort(nums,right,r);//右区间排序 return; } int getrandom(vector<int>& nums,int l,int r) { return nums[rand()%(r-l+1)+l]; } };

算法二:归并排序

将数组mid分成两部分,将左区间排序,将右区间排序,归并两个有序数组

具体就三步

1.mid分为两数组

2.左数组排序

3.右数组排序

4.合并两个有序数组

代码编写:

class Solution { public: vector<int> sortArray(vector<int>& nums) { mergesort(nums,0,nums.size()-1); return nums; } void mergesort(vector<int>& nums,int left,int right) { if(left>=right)return;//递归出口 int mid=left+(right-left)/2;//防止溢出 //区间变成了[left,mid][mid+1,right] //左右区间排序 mergesort(nums,left,mid); mergesort(nums,mid+1,right); //合并两个有序数组 vector<int>tmp(right-left+1); int cur1=left,cur2=mid+1,i=0; while(cur1<=mid&&cur2<=right) { if( nums[cur1]<=nums[cur2])tmp[i++]=nums[cur1++]; else tmp[i++]=nums[cur2++]; } while(cur1<=mid)//其中可能有一个数组更长 { tmp[i++]=nums[cur1++]; } while(cur2<=right) { tmp[i++]=nums[cur2++]; } //还原到nums中 for(int i=left;i<=right;i++) { nums[i]=tmp[i-left]; } } };
http://www.cnnetsun.cn/news/1444012.html

相关文章:

  • 2023-阿里云云效Maven私有仓库实战:快速部署团队共享Jar包
  • MedGemma Medical Vision Lab实际作品:教学PPT嵌入式影像问答交互截图集
  • Hex文件结构解析到实战:用Python自制合并工具完整指南
  • RexUniNLU部署案例:中小企业低成本构建中文智能语义分析平台
  • MiniCPM-o-4.5-nvidia-FlagOS实战指南:图文对话助手快速上手(RTX 4090 D适配)
  • Orekit实战指南(四)——卫星轨道六根数与地面站经纬度的高效转换
  • 告别环境冲突!用Docker在Ubuntu 22.04上5分钟搞定ROS2 Humble和rviz
  • ArmSoM-Sige RK3588开发板实战指南:从开箱到多媒体应用部署
  • 科技伦理兜着岐金兰
  • 腾讯:揭示评估幻觉并构建知识驱动新范式
  • 神经防御工程:皮层植入反扫描病毒的系统架构与测试验证
  • 低资源消耗奇迹:Phi-3-mini-128k-instruct在消费级GPU上的流畅运行演示
  • 架构拆解 OpenClaw:基于心跳唤醒、跨端网关与 Markdown 极简记忆流的 Agent 实践
  • NEC红外编解码模块:UART接口即插即用设计解析
  • 2026年写作小白救星!开源免费AI论文神器——千笔·专业学术智能体
  • 探索永磁同步电机的机械参数辨识与无位置传感器转速估计之路
  • JDK 17 异常信息java.lang.reflect.InaccessibleObjectException:
  • GPS定位背后的数学魔法:手把手教你用Python解析广播星历数据
  • 【高并发内存池】第二弹---实战定长内存池:从原理到性能优化全解析
  • USB-Blaster在Win11报错?3分钟搞定驱动兼容性问题(Quartus 21.4实测)
  • Pixel Dimension Fissioner实操手册:自定义裂变模板(如:小红书风/知乎体/豆瓣腔)
  • 别再用apt了!手把手教你为特定项目(如NTL库)在Ubuntu中定制安装GMP
  • 人大金仓数据库连接数优化实战:从报错到解决方案
  • 生物信息学新手必看:FASTA和FASTQ格式的5个关键区别与实战解析
  • 深入解析PNG隐写技术:从IHDR篡改到IDAT数据块隐藏
  • 【技术实践】InverseSR实战:基于预训练脑部LDM的临床MRI超分辨率快速部署指南
  • 别再乱加电阻了!差分运放输入端那个50Ω电阻,到底怎么用才不翻车?
  • 从零排查到稳定运行:PaddleOCR PP-OCRv5部署与推理实战避坑指南
  • QtCreator新手必看:从安装到跑通第一个QML程序的全流程演示
  • STM32传感器开发避坑指南:为什么你的ADC采集总是不准?(附光敏/声音传感器校准代码)