Leetcode 912. 排序数组
给你一个整数数组 nums,请你将该数组升序排列。
示例 1:
输入:nums = [5,2,3,1]
输出:[1,2,3,5]
示例 2:
输入:nums = [5,1,1,2,0,0]
输出:[0,0,1,1,2,5]
提示:
1 <= nums.length <= 50000
-50000 <= nums[i] <= 50000
速度:
快排:
归并:
堆排序:
解法一:快速排序
思路,如果直接使用原始的快速排序代码,会在某个特别大的case超时,原因是直接选择l作为中枢会使得在某些已排序好的序列中达到最坏情况,使得超时。因此选择中枢时使用随机数选择
class Solution { public: vector<int> sortArray(vector<int>& nums) { srand((unsigned)time(NULL)); //参考leetcode题解使用 quicksort(nums,0,nums.size()-1); return nums; } void quicksort(vector<int>& nums,int l,int r){ if(l<r){ int mid=getPartion(nums,l,r); quicksort(nums,l,mid); quicksort(nums,mid+1,r); } } int getPartion(vector<int>& nums,int l,int r){ int p = rand() % (r - l + 1) + l;//参考leetcode题解使用 swap(nums[l],nums[p]); int tmp=nums[l]; int i=l,j=r; while(i<j){ while(tmp<=nums[j]&&i<j) j--; nums[i]=nums[j]; while(nums[i]<=tmp&&i<j) i++; nums[j]=nums[i]; } nums[i]=tmp; return i; } };
解法二:归并排序
class Solution { public: vector<int> sortArray(vector<int>& nums) { v.resize(nums.size(),0); sort(nums,0,nums.size()-1); return nums; } void sort(vector<int>& nums,int l, int r){ if(l>=r) return; int mid=(l+r)/2; sort(nums,l,mid); sort(nums,mid+1,r); merge(nums,l,mid,r); } void merge(vector<int>& nums,int l,int m,int r){ int i=l,j=m+1,c=l; while(i<=m&&j<=r){ if(nums[i]<=nums[j]) v[c++]=nums[i++]; else v[c++]=nums[j++]; } while(i<=m) v[c++]=nums[i++]; while(j<=r) v[c++]=nums[j++]; for(j=l;j<=r;j++){ nums[j]=v[j]; } } vector<int> v; };
解法三:堆排序
思路:使用大根堆,build之后,每次将0处元素放到末尾,然后fix
class Solution { public: vector<int> sortArray(vector<int>& nums) { sort(nums,nums.size()); return nums; } void sort(vector<int>& nums, int n){ build(nums,n); for(int i=n-1;i>0;i--){ swap(nums[0],nums[i]); fix(nums,i,0); } } void build(vector<int>& nums,int n){ for(int i=n/2-1;i>=0;i--){ fix(nums,n,i); } } void fix(vector<int>& nums,int n,int k){ int tmp=nums[k]; int j=2*k+1; while(j<n){ if(j+1<n&&nums[j+1]>nums[j]) j++; if(tmp>nums[j]) break; nums[k]=nums[j]; k=j; j=2*k+1; } nums[k]=tmp; } };
联系方式:emhhbmdfbGlhbmcxOTkxQDEyNi5jb20=
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
2018-04-17 android JNI调用(Android Studio 3.0.1)(转)
2017-04-17 Linux下进程信息的深入分析