【LittleXi】手搓归并排序
核心思路
- 分治法
- 分治:将数组不断二等分,当数组长度为1时,直接返回该数组,长度为2时,将这个长度为2的数组排序好再返回
- 归并:分好的数组扔进dfs中,得到两个上升的数组,然后利用合并两个上升的思路O(n),合并好这两个数组,再返回
分治代码:
if(nums.size()==1) return nums;
if(nums.size()==2)
{
int mi=min(nums[0],nums[1]);
int ma=max(nums[0],nums[1]);
return {mi,ma};
}
归并代码:
int l=0;
int r=nums.size()-1;
int m=(l+r)/2;
vector<int> tv1;
for(int i=l;i<=m;i++) tv1.push_back(nums[i]);
vector<int> tv2;
for(int i=m+1;i<=r;i++) tv2.push_back(nums[i]);
vector<int> g1=dfs(tv1);
vector<int> g2=dfs(tv2);
vector<int> rev;
int p=0,q=0;
while(p<g1.size()||q<g2.size())
{
if(q==g2.size()||(p<g1.size()&&g1[p]<g2[q]))
rev.push_back(g1[p++]);
else
rev.push_back(g2[q++]);
}
综合代码:
class Solution
{
public:
vector<int> dfs(vector<int> nums)
{
if(nums.size()==1) return nums;
if(nums.size()==2)
{
int mi=min(nums[0],nums[1]);
int ma=max(nums[0],nums[1]);
return {mi,ma};
}
int l=0;
int r=nums.size()-1;
int m=(l+r)/2;
vector<int> tv1;
for(int i=l;i<=m;i++) tv1.push_back(nums[i]);
vector<int> tv2;
for(int i=m+1;i<=r;i++) tv2.push_back(nums[i]);
vector<int> g1=dfs(tv1);
vector<int> g2=dfs(tv2);
vector<int> rev;
int p=0,q=0;
while(p<g1.size()||q<g2.size())
{
if(q==g2.size()||(p<g1.size()&&g1[p]<g2[q]))
rev.push_back(g1[p++]);
else
rev.push_back(g2[q++]);
}
return rev;
}
vector<int> mergesort(vector<int> &nums)
{
return dfs(nums);
}
};