๐ข 5. Sorting
๐ซง ๋ฒ๋ธ ์ ๋ ฌ (Bubble Sort)
- : ๋ฐ๋ก ๊ฐ๊น์ด์ ์๋ ๋ ์ซ์๋ผ๋ฆฌ ๋น๊ต๋ฅผ ํด์ ๋น์ฅ
- ๋ ์์ ์ซ์๋ฅผ ์์ผ๋ก ๋ณด๋ด์ฃผ๋ ๊ฒ์ ๋ฐ๋ณต
- ๊ตฌํ์ ์ฝ์ง๋ง ๊ฐ์ฅ ๋นํจ์จ์ ์ธ ์๊ณ ๋ฆฌ์ฆ
- ์คํ ์ํ์๊ฐ ๊ฐ์ฅ ๋๋ฆฌ๋ค
๋ฒ๋ธ ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ N^2
- ์คํ ์ํ์๊ฐ ๊ฐ์ฅ ๋๋ฆฌ๋ค
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <stdio.h>
int main(void) {
int i, j, temp;
int array[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
for (i = 0; i< 10; i ++) {
for (j = 0 ; j< 10; j++){
if (array[j] > array[j+1]) {
temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
for (i = 0; i<10; i++) {
printf("%d " , array[i]);
}
return 0;
}
// 1 2 3 4 5 6 7 8 9 10
๐ซง ๋ณํฉ ์ ๋ ฌ (Merge Sort)
- : ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ ์ฑํํ ์๊ณ ๋ฆฌ์ฆ
- ํต ์ ๋ ฌ๊ณผ ๋์ผํ ์๊ฐ ๋ณต์ก๋ ๊ฐ์ง
- ํต ์ ๋ ฌ์ ํผ๋ฒ ๊ฐ์ ๋ฐ๋ผ ํธํฅ๋๊ฒ ๋ถํ ๋จ
- ๋ณํฉ ์ ๋ ฌ์ ์ ํํ ๋ฐ์ ์ฉ ๋๋๋ค๋ ์ ์์ ์ต์ ์ ๊ฒฝ์ฐ์๋ N*logN ๋ณด์ฅ
- ํผ๋ฒ ๊ฐ์ด ์๊ณ ํญ์ ๋ฐ์ผ๋ก ๋๋๋ค
- ์ด ๋จ๊ณ์ ํฌ๊ธฐ๊ฐ logN์ด ๋๋๋ก ๋ง๋ค์ด์ค
- ํฉ์น๋ ์๊ฐ์ ์ ๋ ฌ ์ํํ๊ธฐ
- ๋๋น๊ฐ N๋ฒ, ๋์ด๊ฐ logN
- ํต ์ ๋ ฌ์ ํผ๋ฒ ๊ฐ์ ๋ฐ๋ผ ํธํฅ๋๊ฒ ๋ถํ ๋จ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <stdio.h>
int number = 8;
int sorted[8]; // ์ ๋ ฌ ๋ฐฐ์ด์ ๋ฐ๋์ ์ ์ญ๋ณ์๋ก ์ ์ธ
void merge(int a[], int m, int middle, int n) {
int i = m;
int j = middle + 1;
int k = m;
// ์์ ์์๋๋ก ๋ฐฐ์ด์ ์ฝ์
while (i <= middle && j <= n) {
if (a[i] <= a[j]) {
sorted[k] = a[i];
i++;
}
else {
sorted[k] = a[j];
j ++;
}
k++;
}
// ๋จ์ ๋ฐ์ดํฐ ์ฝ์
if (i > middle) {
for (int t =j; t<=n;t++) {
sorted[k] = a[t];
k++;
}
} else {
for (int t = i; t <= middle; t++) {
sorted[k] = a[t];
k++;
}
}
// ์ ๋ ฌ๋ ๋ฐฐ์ด ์ฝ์
for (int t =m; t <=n; t++) {
a[t] = sorted[t];
}
}
void mergeSort(int a[], int m, int n) {
// ํฌ๊ธฐ๊ฐ 1 ๋ณด๋ค ํด ๊ฒฝ์ฐ
if (m <n) {
int middle = (m + n) /2;
mergeSort(a, m, middle);
mergeSort(a, middle +1, n);
merge(a, m ,middle, n);
}
}
int main(void) {
int array[number] = {7,6,5,8,3,5,9,1};
mergeSort(array, 0, number-1);
for (int i=0; i <= number; i ++) {
printf("%d ", array[i]);
}
}
// 1 3 5 5 6 7 8 9
๐ซง ํต ์ ๋ ฌ (Quick Sort)
- : ํน์ ํ ๊ฐ์ ๊ธฐ์ค์ผ๋ก ํฐ ์ซ์์ ์์ ์ซ์๋ฅผ ์๋ก ๊ตํํ ๋ค์ ๋ฐฐ์ด์ ๋ฐ์ผ๋ก ๋๋๋ค
- ํต ์ ๋ ฌ์๋ ๊ธฐ์ค๊ฐ์ด ์๋ค -> ํผ๋ฒ(Pivot)
- ์ฒซ๋ฒ์งธ ์์๋ฅผ ํผ๋ฒ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์ฌ์ฉ
ํต ์ ๋ ฌ์ ์๊ฐ ๋ณต์ก๋๋ N*logN
- ์ฒซ๋ฒ์งธ ์์๋ฅผ ํผ๋ฒ ๊ฐ์ผ๋ก ์ค์ ํ๊ณ ์ฌ์ฉ
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
int number = 10;
int data[10] = {1, 10, 5, 8, 7, 6, 4, 3, 2, 9};
void quickSort(int* data, int start, int end) {
if (start >= end) { // ์์๊ฐ 1๊ฐ์ธ ๊ฒฝ์ฐ ๊ทธ๋๋ก ๋๊ธฐ
return;
}
int key = start; // ํค๋ ์ฒซ๋ฒ์งธ ์์ (pivot)
int i = start + 1;
int j = end;
int temp;
while (i <= j) { // ์๊ฐ๋ฆด ๋๊น์ง ๋ฐ๋ณต
while (i <=end && data[i] <= data[key]) { // ํค ๊ฐ๋ณด๋ค ํฐ ๊ฐ์ ๋ง๋ ๋๊น์ง
i++;
}
while ( j > start && data[j] >= data[key]) { // ํค ๊ฐ๋ณด๋ค ์์ ๊ฐ์ ๋ง๋ ๋๊น์ง
j--;
}
if (i > j) { // ํ์ฌ ์๊ฐ๋ฆฐ ์ํ๋ฉด ํค ๊ฐ๊ณผ ๊ต์ฒด
temp = data[j];
data[j] = data[key];
data[key] = temp;
}
else { // ์๊ฐ๋ฆฌ์ง ์์๋ค๋ฉด i์ j ๊ต์ฒด
temp = data[j];
data[j] = data[i];
data[i] = temp;
}
}
quickSort(data, start, j -1);
quickSort(data, j+1, end);
}
int main(void) {
quickSort(data, 0, number - 1);
for (int i = 0; i< number; i++) {
printf("%d ", data[i]);
}
}
// 1 2 3 4 5 6 7 8 9 10
๐ซง ๊ธฐ์ ์ ๋ ฌ (radix)
- : ์ฃผ์ด์ง ์ ๋ค๊ฐ์ ๋น๊ต๋ฅผ ํ์ง ์๊ณ ๋ฒํท์ ์ฌ์ฉํด ์ ๋ ฌํ๋ ๋ฐฉ๋ฒ์ผ๋ก, ๋ฎ์ ์๋ฆฌ(1์ ์๋ฆฌ)์์ ๋์ ์๋ฆฌ(10^n ์๋ฆฌ) ์์ผ๋ก ๋ฒํท์ ๋ฃ๋ ๋ฐฉ๋ฒ์ผ๋ก ์ ๋ ฌํ๋ค.
์์๊ฐ์ด ๋ชจ๋ k ์๋ฆฟ์ ์ดํ์ ์์ฐ์์ธ ํน์ํ ๊ฒฝ์ฐ์ ์ฌ์ฉํ ์ ์๋ ์ ๋ ฌ๋ฐฉ๋ฒ์ด๋ค.
- ๊ฐ์ฅ ๋ฎ์ 1์ ์๋ฆฟ์๋ง ๊ฐ์ง๊ณ ๋ชจ๋ ์๋ฅผ ์ ๋ ฌํ๋ค.
- ๊ทธ ๋ค์์ผ๋ก ๋ฎ์ 10์ ์๋ฆฟ์๋ง์ผ๋ก ์ ๋ ฌํ๋ค.
- ์ด ๊ณผ์ ์ ๋ง์ง๋ง ์๋ฆฟ์๊น์ง ๋ฐ๋ณตํ๋ค.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
from collections import deque
def radixSort():
nums = list(map(int, input().split(' ')))
buckets = [deque() for _ in range(10)]
max_val = max(nums)
queue = deque(nums)
digit = 1 # ์๋ฆฟ์
while (max_val >= digit): # ๊ฐ์ฅ ํฐ ์์ ์๋ฆฟ์์ผ ๋ ๊น์ง๋ง ์คํ
while queue:
num = queue.popleft()
buckets[(num // digit) % 10].append(num) # ๊ฐ ์๋ฆฌ์ ์(0~9)์ ๋ฐ๋ผ ๋ฒํท์ num์ ๋ฃ๋๋ค.
# ํด๋น ์๋ฆฟ์์์ ๋ฒํท์ ๋ค ๋ฃ์์ผ๋ฉด, ๋ฒํท์ ๋ด๊ฒจ์๋ ์์๋๋ก ๊บผ๋ด์ ์ ๋ ฌํ๋ค.
for bucket in buckets:
while bucket:
queue.append(bucket.popleft())
print(digit,"์ ์๋ฆฟ ์ ์ ๋ ฌ: ", list(queue))
digit *= 10 # ์๋ฆฟ์ ์ฆ๊ฐ์ํค๊ธฐ
print(list(queue))
This post is licensed under CC BY 4.0 by the author.