728x90
๋ฐ์ํ
ํฉ๋ณ ์ ๋ ฌ

ex) n๊ฐ์ ์์ ์ ์๋ฅผ ์ ๋ ฅ๋ฐ์ ์์๋ค์ ํฉ๋ณ์ ๋ ฌํ์ฌ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ ฌ
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void makeList (int* L, int n) {
for (int i = 0; i < n; i++) {
scanf("%d", &L[i]);
}
}
void merge (int* L1, int* L2, int left, int mid, int right) {
int i ,j, k, l;
i = left;
j = mid + 1;
k = left;
while (i <= mid && j <= right) {
if (L1[i] <= L1[j])
L2[k++] = L1[i++];
else
L2[k++] = L1[j++];
}
if (i > mid) {
for (l = j; l <= right; l++) {
L2[k++] = L1[l];
}
}
else {
for (l = i; l <= mid; l++) {
L2[k++] = L1[l];
}
}
for (l = left; l <= right; l++) {
L1[l] = L2[l];
}
}
void mergeSort (int* L1, int* L2, int left, int right) {
int mid;
if (left < right) {
mid = (left + right) / 2;
mergeSort(L1, L2, left, mid);
mergeSort(L1, L2, mid + 1, right);
merge(L1, L2, left, mid, right);
}
}
void printList (int* L, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", L[i]);
}
printf("\n");
}
//๋ฐฐ์ด๋ก ๊ตฌํ
int main () {
int n;
scanf("%d", &n);
int* L1 = (int*)malloc(sizeof(int) * n);
int* L2 = (int*)malloc(sizeof(int) * n);
makeList(L1, n);
mergeSort(L1, L2, 0, n - 1);
printList(L2, n);
return 0;
}
ํต ์ ๋ ฌ
: ๋ถํ ํต์น๋ฒ์ ๊ธฐ์ดํ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ

divide : ๊ธฐ์ค์์p(๋ณดํต ๋ง์ง๋ง ์์)๋ฅผ ์ ํํ์ฌ L์ 3๋ถ๋ถ์ผ๋ก ๋ถํ
LT : p๋ณด๋ค ์์ ์์๋ค
EQ : p์ ๊ฐ์ ์์๋ค
GT : p๋ณด๋ค ํฐ ์์๋ค
์ฌ๊ท(recur) : LT, GT ์ ๋ ฌ
ํต์น(conquer) : LT, EQ, GT ๊ฒฐํฉ
list ๋ถํ (partition)

1. L๋ก๋ถํฐ ๊ฐ ์์ e ์ญ์
2. e๋ฅผ ๊ธฐ์ค์์์ธ p์ ๋น๊ต๊ฒฐ๊ณผ์ ๋ฐ๋ผ ๋ถlist LT,EQ,GT์ ์ฝ์
์ ์๋ฆฌ ํต ์ ๋ ฌ

์ ์๋ฆฌ ๋ถํ

ex) n๊ฐ์ ์์ ์ ์๋ฅผ ์ ๋ ฅ๋ฐ์ ํต ์ ๋ ฌ๋ก ์ ๋ ฌ. pivot์ ์์น๋ randomํ๊ฒ ์ ํ
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define SWAP(x,y,t) ((t) = (x), (x) = (y), (y) = (t))
void makeList (int* L, int n) {
for (int i = 0; i < n; i++) {
scanf("%d", &L[i]);
}
}
void printList (int* L, int n) {
for (int i = 0; i < n; i++) {
printf("%d ", L[i]);
}
printf("\n");
}
int partition (int *L, int left, int right, int p) {
int pivot, tmp, low, high;
pivot = L[p];
SWAP(L[p], L[right], tmp); //pivot์์น ๋ณ๊ฒฝ(์ค๋ฅธ์ชฝ)
low = left;
high = right - 1;
while (low <= high) {
while (low <= high && L[low] <= pivot) {
low++;
}
while (high >= low && L[high] >= pivot) {
high--;
}
if (low < high) {
SWAP(L[low], L[high], tmp);
}
}
//pivot์์น ์ ํจ
SWAP(L[low], L[right], tmp);
return low;
}
void quickSort (int* L, int left, int right) {
if (left < right) {
int p = rand() % (right - left + 1) + left; //pivot ์ค์
int q = partition(L, left, right, p); //sortํ pivot ์์น
quickSort(L, left, q - 1);
quickSort(L, q + 1, right);
}
}
//๋ฐฐ์ด๋ก ๊ตฌํ
int main () {
int n;
scanf("%d", &n);
int* L = (int*)malloc(sizeof(int) * n);
makeList(L, n);
// printList(L, n);
quickSort(L, 0, n-1);
printList(L, n);
return 0;
}
728x90
๋ฐ์ํ
'Programming > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| #2. ํ๊ณผ ํ์ ๋ ฌ (2) | 2022.09.15 |
|---|---|
| #1. ์ฐ์ ์์ ํ (0) | 2022.09.07 |