글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자를 적어주세요. 글의 요약 설명 부분. 150자입니다

 

 

 


HEAP SORT & MERGING SORT

본문내용넣기

 

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    vector<int> v{ 15342 };
 
    srand(time(0));
 
    for (int i = 0; i < 50; i++)
    {
        int randValue = rand() % 100;
        v.push_back(randValue);
    }
 
    //std::sort(v.begin(), v.end());
    //HeapSort(v);
 
    MergeSort(v, 0, v.size() - 1);
}
cs

--recursive

 

📁build


Heap Sort 힙 정렬

 

 

시간 복잡도 NlogN

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void HeapSort(vector<int>& v)
{
    priority_queue<intvector<int>, greater<int>> pq;
 
    // O(NlogN)
    for (int num : v)
        pq.push(num);
 
    v.clear();
 
    // O(NlogN)
    while (pq.empty() == false)
    {
        v.push_back(pq.top());
        pq.pop();
    }
}
cs

 

 


 

Merge Sort 병합 정렬

 

 

시간 복잡도 NlogN
// 분할 정복 (Divide and Conquer)
// - 분할 (Divide)  : 문제를 더 단순하게 분할한다.
// - 정복 (Conquer) : 분할된 문제를 해결한다.
// - 결합 (Combine) : 결과를 취합하여 마무리한다.

// [3][K][7][2][J][4][8][9]          8개 * 1
// [3][K][7][2]  [J][4][8][9]        4개 * 2
// [3][K]  [7][2]  [J][4]  [8][9]    2개 * 4
// [3] [K] [7] [2] [J] [4] [8] [9]   1개 * 8
// [3][K]  [2][7]  [4][J]  [8][9]    2개 * 4

 

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
void MergeResult(vector<int>& v, int left, int mid, int right)
{
    int leftIdx = left;
    int rightIdx = mid + 1;
 
    vector<int> temp;
 
    while (leftIdx <= mid && rightIdx <= right)
    {
        if (v[leftIdx] <= v[rightIdx])
        {
            temp.push_back(v[leftIdx]);
            leftIdx++;
        }
        else
        {
            temp.push_back(v[rightIdx]);
            rightIdx++;
        }
    }
 
    // 왼쪽이 먼저 끝났으면, 오른쪽 나머지 데이터 복사
    if (leftIdx > mid)
    {
        while (rightIdx <= right)
        {
            temp.push_back(v[rightIdx]);
            rightIdx++;
        }
    }
    // 오른쪽이 먼저 끝났으면, 왼쪽 나머지 데이터 복사
    else
    {
        while (leftIdx <= mid)
        {
            temp.push_back(v[leftIdx]);
            leftIdx++;
        }
    }
 
    for (int i = 0; i < temp.size(); i++)
        v[left + i] = temp[i];
 
}
 
void MergeSort(vector<int>& v, int left, int right)
{
    if (left >= right)
        return;
 
    int mid = (left + right) / 2;
    MergeSort(v, left, mid);
    MergeSort(v, mid + 1, right);
 
    MergeResult(v, left, mid, right);
}
cs

 

 


 

H3 중제목

본문내용넣기

 

 

 

 

 


 

마무리

마무리

 

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
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
#include <iostream>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <thread>
using namespace std;
 
// 힙 정렬
void HeapSort(vector<int>& v)
{
    priority_queue<intvector<int>, greater<int>> pq;
 
    // O(NlogN)
    for (int num : v)
        pq.push(num);
 
    v.clear();
 
    // O(NlogN)
    while (pq.empty() == false)
    {
        v.push_back(pq.top());
        pq.pop();
    }
}
 
// 병합 정렬
// 분할 정복 (Divide and Conquer)
// - 분할 (Divide)  : 문제를 더 단순하게 분할한다.
// - 정복 (Conquer) : 분할된 문제를 해결한다.
// - 결합 (Combine) : 결과를 취합하여 마무리한다.
 
// [3][K][7][2][J][4][8][9]          8개 * 1
// [3][K][7][2]  [J][4][8][9]        4개 * 2
// [3][K]  [7][2]  [J][4]  [8][9]    2개 * 4
// [3] [K] [7] [2] [J] [4] [8] [9]   1개 * 8
// [3][K]  [2][7]  [4][J]  [8][9]    2개 * 4
 
void MergeResult(vector<int>& v, int left, int mid, int right)
{
    int leftIdx = left;
    int rightIdx = mid + 1;
 
    vector<int> temp;
 
    while (leftIdx <= mid && rightIdx <= right)
    {
        if (v[leftIdx] <= v[rightIdx])
        {
            temp.push_back(v[leftIdx]);
            leftIdx++;
        }
        else
        {
            temp.push_back(v[rightIdx]);
            rightIdx++;
        }
    }
 
    // 왼쪽이 먼저 끝났으면, 오른쪽 나머지 데이터 복사
    if (leftIdx > mid)
    {
        while (rightIdx <= right)
        {
            temp.push_back(v[rightIdx]);
            rightIdx++;
        }
    }
    // 오른쪽이 먼저 끝났으면, 왼쪽 나머지 데이터 복사
    else
    {
        while (leftIdx <= mid)
        {
            temp.push_back(v[leftIdx]);
            leftIdx++;
        }
    }
 
    for (int i = 0; i < temp.size(); i++)
        v[left + i] = temp[i];
 
}
 
void MergeSort(vector<int>& v, int left, int right)
{
    if (left >= right)
        return;
 
    int mid = (left + right) / 2;
    MergeSort(v, left, mid);
    MergeSort(v, mid + 1, right);
 
    MergeResult(v, left, mid, right);
}
 
 
int main()
{
    vector<int> v{ 15342 };
 
    srand(time(0));
 
    for (int i = 0; i < 50; i++)
    {
        int randValue = rand() % 100;
        v.push_back(randValue);
    }
 
    //std::sort(v.begin(), v.end());
    //HeapSort(v);
 
    MergeSort(v, 0, v.size() - 1);
}
cs