1. 程式人生 > >【NOJ1002】【演算法實驗一】【分治演算法】歸併排序

【NOJ1002】【演算法實驗一】【分治演算法】歸併排序

1002.歸併排序

時限:1000ms 記憶體限制:10000K  總時限:3000ms

描述

給定一個數列,用歸併排序演算法把它排成升序。

輸入

第一行是一個整數n(n不大於10000),表示要排序的數的個數; 下面一行是用空格隔開的n個整數。

輸出

輸出排序後的數列,每個數字佔一行。

輸入樣例

5 3 2 1 4 5

輸出樣例

1 2 3 4 5  

#include <iostream>
using namespace std;

int a[10001];
int tmp[10001];
void Mergesort(int a[],int left,int right);
int main()
{
	int n,i;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i];
	Mergesort(a,0,n-1);
	for(i=0;i<n;i++)
		cout<<a[i]<<endl;
	return 0;
}

void Mergesort(int a[],int left,int right)
{
	if(left==right)
		return;
	else{
		int mid=(left+right)/2;

		Mergesort(a,left,mid);
		Mergesort(a,mid+1,right);

		//gui bing
		int i=left,j=mid+1,k=left;
		for(;i<=mid&&j<=right;){
			if(a[i]<a[j])
				tmp[k++]=a[i++];
			else
				tmp[k++]=a[j++];
		}
		for(;i<=mid;)
			tmp[k++]=a[i++];
		for(;j<=right;)
			tmp[k++]=a[j++];

		for(k=left;k<=right;k++)
			a[k]=tmp[k];
	}
}