归并排序
大佬链接,有图有注释,很详细https://blog.csdn.net/k_koris/article/details/80508543
#include <cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn = 1005;
int a[maxn];
void merge_a(int l,int r,int mid)
{
int b[r-l+1];
for(int k=l;k<=r;k++)
{
b[k-l] = a[k];
}
int i = l; //指向左边数组的开头
int j = mid + 1; //指向右边数组开头
for(int k=l;k<=r;k++)
{
if(i>mid) //如果左边的数组已经排完
{ //左边每一个都比右边的小,右边就不比了直接放入数组a
a[k] = b[j-l];
j++;
}
else if(j>r) //同理
{
a[k] = b[i-l];
i++;
}
else if(b[i-l]>b[j-l]) //谁小谁上
{
a[k] = b[j-l];
j++;
}
else
{
a[k] = b[i-l];
i++;
}
}
}
void merge_sort(int l,int r)
{
if(l>=r)
{
return ;
}
int mid = (l+r)/2;
merge_sort(l,mid);
merge_sort(mid+1,r);
merge_a(l,r,mid);
}
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
}
merge_sort(1,n);
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
}
return 0;
}