1. 程式人生 > >洛谷1177 歸併排序

洛谷1177 歸併排序

因為這個題去學了這歸併排序和快排,真的神奇,尤其是歸併排序的程式碼,有一種美感呢。

//歸併排序

#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
int a[maxn];//從小到大 
#define swap(x,y) x=x^y,y=x^y,x=x^y;

int* merg(int arr1[],int l,int mod,int r)
{
	int i=l,j=mod+1,k=0;
	int* arr2=(int*)malloc(sizeof(int)*(r-l+1));
	while(i<=mod&&j<=r){
		if(arr1[i]<=arr1[j]) arr2[k++]=arr1[i++];
		else arr2[k++]=arr1[j++];
	}
	while(i<=mod){
		arr2[k++]=arr1[i++];
	}
	while(j<=r){
		arr2[k++]=arr1[j++];
	}
	
	for(i=0,j=l;i<r-l+1;i++){
		arr1[j++]=arr2[i];
	}
	free(arr2);
}

void mergesort(int a[],int l,int r)
{
	if(l<r){
		int mod=(l+r)>>1;
		mergesort(a,l,mod);
		mergesort(a,mod+1,r);
		merg(a,l,mod,r);
	}
} 
int main()
{
	int n,i,j,k;
	cin >> n;
	int sum=0;
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	mergesort(a,0,n-1);
	for(i=0;i<n;i++){
		printf("%d",a[i]);
		if(i!=n-1) printf(" ");
		else printf("\n");
	} 
	return 0;
}