공부/알고리즘

정렬(sort) 관련

하이원 2020. 12. 9. 13:07

insertion sort (삽입정렬)

- 주로 top N을 구할때 만들어 두고 사용한다. 32개 이하의 갯수일때는 제일 빠르다

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// top10을 뽑으려면 12개 정도 여유있게
// 들어간 갯수를 관리하기 위한 변수
int trr[12= { 0 }, an = 0;
int i = 0, j = 0;
 
// 들어간 갯수 뒤에서부터 앞으로 체크
for (i = 0; i < 10++i) {
    for (j = an - 1; j >= 0--j) {
        // 현재 위치와 나를 비교해서 내가 더 좋으면
        // 뒷자리로 하나 보내고, 아니면 break;
        // 내가 들어갈 자리는 j+1자리 (j는 나보다 좋으니까)
        if (trr[j] > arr[i])
            trr[j + 1= trr[j];
        else break;
    }
    // j+1 자리에 나를 넣어준다.
    trr[j + 1= arr[i];
    an++;
}
cs

 

merge sort

- 가장 일반적으로 쓰인다. 무조건 외워야 한다.

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
 
 
// arr원배열, trr새배열
int arr[10], trr[10];
 
void mergesort(int s, int e)
{
    // 1. base condition
    // [1,1] 처럼 하나남으면 리턴
    if (s >= e)    return;
 
    // 2. devide
    // 반씩 나눠서 재귀
    int m = (s + e) / 2;
    mergesort(s, m);
    mergesort(m + 1, e);
 
    // 3. merge
    // a는 s에서 m까지니 다 돌면 m+1이 되어있고
    // b는 m+1에서 e까지니 다 돌면 e+1이 된다.
    // 임시 배열에 넣을 t 셋팅
    int a = s;
    int alast = m + 1;
    int b = m + 1;
    int blast = e + 1;
    int t = 0;
 
    while (1)
    {
        // a도 끝까지, b도 끝까지 가면 끝
        if (a == alast && b == blast)    break;
 
        // a가 끝나면 b를 끝까지 담고
        if (a == alast)    trr[t++= arr[b++];
        // b가 끝나면 a를 끝까지 담고
        else if (b == blast)    trr[t++= arr[a++];
        // a가 크면 a를 담고
        else if (arr[a] > arr[b])    trr[t++= arr[a++];
        // b가 크면 b를 담고
        else trr[t++= arr[b++];
    }
 
    // 4. copy
    // 임시배열에 있는걸 옮겨 담는다
    for (int i = 0; i < t; ++i)    {
        arr[i + s] = trr[i];
    }
}
cs

 

mergesort struct일 경우 조건문을 아래처럼 처리한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
while (1)
{
    // struct일 경우에는 비교 조건문을 아래처럼
    if (a == alast) trr[t++= arr[b++];
    else if (b == blast) trr[t++= arr[a++];
    else if (arr[a].id < arr[b].id) trr[t++= arr[a++];
    else if (arr[a].id == arr[b].id) {
        // 반드시 양쪽 다 체크할 수 있는 조건문이 있어야 한다.
        if (arr[a].time < arr[b].time)    trr[t++= arr[a++];
        else trr[t++= arr[b++];
    }
    else trr[t++= arr[b++];
}
cs

'공부 > 알고리즘' 카테고리의 다른 글

DLL + heap  (0) 2021.02.19
LL 이진탐색트리  (0) 2020.12.10
부분합 문제  (0) 2020.12.07
기본 dfs, bfs  (0) 2020.12.01
hash key 관련  (0) 2020.12.01