e. 자료구조 및 알고리즘

C언어 합병정렬(Merge Sort 2)

로봇쟁이 2019. 7. 12. 15:12
#include <stdio.h>
#include <stdlib.h>

// conquer
void merge(int a[], int low, int mid, int high) {
	int temp[100000];
	int i=low;
	int j=mid+1;
	int k=0;
	// fight
	while(i <= mid && j <= high) {
		if(a[i] <= a[j]) {
			temp[k] = a[i];
			k++;
			i++;
		}
		else {
			temp[k] = a[j];
			k++;
			j++;
		}
	}
	// 왼쪽이 살아있을때 전체 집어 넣기 
	while(i <= mid) {
		temp[k] = a[i];
		k++;
		i++;
	}
	// 오른쪽이 살아있을때 전체 집어 넣기 
	while(j <= high) {
		temp[k] = a[j];
		k++;
		j++;
	}
	
	k--;
	//기존 배열에 정리 
	while(k >= 0) {
		a[low+k] = temp[k];
		k--;
	}
}


// divide
void mergesort(int a[], int low, int high) {
	
	if(low < high) {
		int m = (low+high)/2;
		
		// left side
		mergesort(a, low, m);
		
		// right side
		mergesort(a, m+1, high);
		
		// conquer
		merge(a, low, m, high);
	}
	else {
		return;
	}
}

int main(int argc, char *argv[]) {
	int buf[100001];
	int N, C;
	scanf("%d", &N);
	scanf("%d", &C);
	
	int i=0;
	for(i=0; i<N; i++) {
		scanf("%d", &buf[i]);
	}
	
	mergesort(buf, 0, N-1);

	if(C == 0) {
		for(i=0; i<N; i++) {
			printf("%d\n", buf[i]);
		}
	}
	else {
		for(i=N-1; i>=0; i--) {
			printf("%d\n", buf[i]);
		}
	}

	return 0;
}
반응형