算法思路
算法动态图解
1.不断将无序数组划分为均匀两部分,直到不可划分(数组长度为2即可)
2.将无序数组整理为有序后,两两合并
#include <iostream>
using namespace std;
const int N = 100010;
int n,q[N],tmp[N];
void merge_sort(int l,int r,int q[])
{
if(l>=r)
return;
//将问题划分为子问题
int mid = l+r>>1;
//递归处理子问题
merge_sort(l,mid,q),merge_sort(mid+1,r,q);
//合并子问题
int k=0,i=l,j=mid+1;
//合并数组
while(i<=mid && j<=r)
{
if(q[i]<=q[j])
tmp[k++] = q[i++];
else
tmp[k++] = q[j++];
}
while(i<=mid)
tmp[k++] = q[i++];
while(j<=r)
tmp[k++] = q[j++];
//将tmp复制回原来的数组
for(k=0,i=l; i<=r ;i++,k++)
q[i] = tmp[k];
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&q[i]);
merge_sort(0,n-1,q);
for(int i=0;i<n;i++)
printf("%d ",q[i]);
return 0;
}