1. 程式人生 > >歸併排序理解遞迴

歸併排序理解遞迴

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