ํ‹ฐ์Šคํ† ๋ฆฌ ๋ทฐ

๋ถ„ํ• ํ†ต์น˜๋ฒ•

1. ๋ถ„ํ• 

2. ์žฌ๊ท€

3. ํ†ต์น˜

 

ํ•ฉ๋ณ‘์ •๋ ฌ: ๋ถ„ํ• ํ†ต์น˜๋ฒ•์— ๊ธฐ์ดˆํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜

- ํž™ ์ •๋ ฌ๊ณผ ๋‹ฌ๋ฆฌ ์šฐ์„ ์ˆœ์œ„ ํ ์‚ฌ์šฉํ•˜์ง€ X

- ๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์  ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผ

 

 

๋‹จ์ผ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ์ด์šฉํ•œ ํ•ฉ๋ณ‘์ •๋ ฌ ๊ตฌํ˜„(์ค‘๋ณต ์ž…๋ ฅ O)

 

์ž…๋ ฅ ์˜ˆ์‹œ 1
3 โ†ฆ n
4 9 1

์ถœ๋ ฅ ์˜ˆ์‹œ 1
โ–ก1 4 9 โ†ฆ ์ •๋ ฌ ๊ฒฐ๊ณผ


์ž…๋ ฅ ์˜ˆ์‹œ 2
8 โ†ฆ n
73 65 48 31 29 20 8 3

์ถœ๋ ฅ ์˜ˆ์‹œ 2
โ–ก3 8 20 29 31 48 65 73 โ†ฆ ์ •๋ ฌ ๊ฒฐ๊ณผ

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>

//ํ•ฉ๋ณ‘์ •๋ ฌ

typedef struct ListNode {
	int elem;
	struct ListNode* next;
}node;

void addList(node** L, int elem) {// ๋ฆฌ์ŠคํŠธ์— ์›์†Œ ์ถ”๊ฐ€
	node* q = (node*)malloc(sizeof(node));
	q->elem = elem;
	q -> next = NULL;

	node* p = *L;
	if (*L == NULL) {
		*L = q;
	}
	else {
		while (p->next != NULL) {
			p = p->next;
		}
		p->next = q;
	}
}

void partition(node* L, node** L1, node** L2, int size) {
	node* p = L;

	*L1 = L;
	for (int i = 0; i < (size / 2) - 1; i++) {
		p = p->next;
	}
	*L2 = p->next;
	p->next = NULL;
}

node* merge(node* L1, node* L2) {
	node* p = NULL;

	if (L1 == NULL)
		return L2;
	else if (L2 == NULL)
		return L1;

	if (L1->elem < L2->elem) {
		p = L1;
		p->next = merge(L1->next, L2);
	}
	else {
		p = L2;
		p->next = merge(L1, L2->next);
	}

	return p;
}

void mergeSort(node** L, int size) {
	node* L1, * L2, * p = *L;

	if (size <= 1)
		return;

	partition(p, &L1, &L2, size);
	if (size % 2 == 0) {
		mergeSort(&L1, size / 2);
		mergeSort(&L2, size / 2);
	}
	else {
		mergeSort(&L1, size / 2);
		mergeSort(&L2, (size / 2) + 1);
	}

	*L = merge(L1, L2);
}

void printList(node* L) {
	node* p = L;

	while (p != NULL) {
		printf(" %d", p->elem);
		p = p->next;
	}
}

void freeList(node* L) {
	node* p = L;

	while (p != NULL) {
		L = L->next;
		free(p);
		p = L;
	}
}

int main() {
	int n, e;

	node* L = NULL;
	scanf("%d", &n);

	for (int i = 0; i < n; i++) {
		scanf("%d", &e);
		getchar();
		addList(&L, e);
	}

	mergeSort(&L, n);
	printList(L);

	freeList(L);// ๋…ธ๋“œ free

	return n;
}

 

*์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ ๋งํฌ ์—ฐ๊ฒฐ ํ•˜๋Š” ๋ถ€๋ถ„ ์ž˜ ์ดํ•ดํ•˜๊ธฐ

**partition ํ•จ์ˆ˜ ๋ถ€๋ถ„์ด ์ž˜ ์ดํ•ด๊ฐ€ ์•ˆ๋จ ๋ณต์Šต ํ•˜๊ธฐ

๋ฐ˜์‘ํ˜•