はなたの日記

ギターのコードについて書きます

ALDS1_5_B Merge Sort

問題
マージソート | アルゴリズムとデータ構造 | Aizu Online Judge

マージソートを実装する問題です。
マージソートとかクイックソートとか、分割統治法がすごい苦手なのですが、頑張ってみました。
アルゴリズムは問題のページに載っているのですが、自分で頑張って考えてみました。

#include<stdio.h>
#define N 500000

int cnt=0;

int a[N];

void merge(int left,int mid,int right){
	int L[N/2];
	int R[N/2];
	int i,j,idx;
	
	for(i=left;i<=mid;i++)
		L[i-left]=a[i];
	
	
	for(i=mid+1;i<=right;i++)
		R[i-mid-1]=a[i];

	i=0;  j=0;  idx=left;
	
	while(i<=(mid-left) && j<=(right-mid-1)){
		if(L[i] < R[j])
			a[idx++]=L[i++];
			
		else 
			a[idx++]=R[j++];
			
		cnt++;
	}
	
	while(i<=(mid-left)){
		a[idx++]=L[i++];
		cnt++;
	}
	
	while(j<=(right-mid-1)){
		a[idx++]=R[j++];
		cnt++;
	}
	
	return;
	
}

void mergeSort(int left,int right){
	int mid=(left+right)/2;
	
	if(left < right){
		mergeSort(left,mid);
		mergeSort(mid+1,right);
		merge(left,mid,right);
	}
	
	return;
	
}

int main(){
	int n,i;
	
	scanf("%d",&n);
	
	for(i=0;i<n;i++)
		scanf("%d",&a[i]);
	
	mergeSort(0,n-1);
	
	for(i=0;i<n-1;i++)
		printf("%d ",a[i]);
	printf("%d\n",a[n-1]);
	
	printf("%d\n",cnt);
	
	return 0;
	
}

掲載されてるアルゴリズムは、端にINFを設定して、mergeを一つのforで済ませていて賢いなと思いました。