https://zh.wikipedia.org/wiki/%E5%BD%92%E5%B9%B6%E6%8E%92%E5%BA%8F
先上一个网站,这个 网站最好看看。
点开之后可以看到归并排序的动态演示图,只要能理解这个图,就能够理解递归和归并排序了。
你可以看到图里面的数分了四层,然后变成八个数,但是每两个数是一个递归里面的,所以先从第一个和第二个数开始归并,归并的时候比较大小,归并完之后,这是这个小递归的结束,然后这层总共有四个小递归,依次执行完即可。
然后才是第三层递归的执行,因为已经分过了,所以只执行归并,然后再去执行之前的递归。
#include <iostream>
using namespace std;
int a[10]={13,17,15,20,22,23,30,28,40,10};
int b[10];
void Merge(int a[],int s,int m,int e,int tmp[])
{
int pb=0;
int p1=s;
int p2=m+1;
while (p1<=m&&p2<=e) {
if (a[p1]>a[p2]) {
tmp[pb++]=a[p2++];
}
else {
tmp[pb++]=a[p1++];
}
}
while (p1<=m) {
tmp[pb++]=a[p1++];
}
while (p2<=e) {
tmp[pb++]=a[p2++];
}
for (int i=0;i<e-s+1;i++) {
a[s+i]=tmp[i];
}
}
void MergeSort(int a[],int s,int e,int tmp[])
{
if (s<e) {
int mid=s+(e-s)/2;
MergeSort(a,s,mid,tmp);
MergeSort(a,mid+1,e,tmp);
Merge(a,s,mid,e,tmp);
}
}
int main()
{
int size=sizeof(a)/sizeof(int);
MergeSort(a,0,size-1,b);
for (int i=0;i<size;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}