归并排序理解递归

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;
}

猜你喜欢

转载自blog.csdn.net/qq_41090676/article/details/83957581