3105 Problem B 基礎排序III:歸併排序

問題 B: 基礎排序III:歸併排序

時間限制: 3 Sec  內存限制: 128 MB

題目描述

歸併排序是一個時間複雜度爲O(nlogn)的算法,對於大量數據遠遠優於冒泡排序與插入排序。

這是一道排序練習題,數據量較大,請使用歸併排序完成。

輸入

第一行一個數字n,代表輸入的組數

其後每組第一行輸入一個數字m,代表待排序數字的個數

其後m行每行一個數據,大小在1~100000之間,互不相等,最多有10萬個數據。

輸出

升序輸出排好序的數據,每行一個數字

樣例輸入

1
10
10
9
8
7
6
5
4
3
2
1

樣例輸出

1
2
3
4
5
6
7
8
9
10

經驗總結

基礎的歸併算法,我是採用遞歸實現的,當然也可以非遞歸實現~

AC代碼

#include <cstdio>
void merge(int a[],int l1,int r1,int l2,int r2)
{
	int i=l1,j=l2;
	int temp[100010],index=0;
	while(i<=r1&&j<=r2)
	{
		if(a[i]<=a[j])
			temp[index++]=a[i++];
		else
			temp[index++]=a[j++];
	}
	while(i<=r1) temp[index++]=a[i++];
	while(j<=r2) temp[index++]=a[j++];
	for(int i=0;i<index;i++)
		a[l1+i]=temp[i];
}
void mergesort(int a[],int left,int right)
{
	if(left<right)
	{
		int mid=left+(right-left)/2;
		mergesort(a,left,mid);
		mergesort(a,mid+1,right);
		merge(a,left,mid,mid+1,right);
	}
}
int main()
{
	int n,no[100010],m;
	while(~scanf("%d",&m))
	{
		for(int j=0;j<m;j++)
		{
			scanf("%d",&n); 
			for(int i=0;i<n;i++)
				scanf("%d",&no[i]);
			mergesort(no,0,n-1);
			for(int i=0;i<n;i++)
				printf("%d\n",no[i]);
		} 
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章