크기를 절반씩 나누어 가장 작은 크기부터 정렬을 한 다음
정렬한 배열을 합쳐 다시 정렬하는 분할정복 방식의 알고리즘입니다.
그림과 같은 방식으로 정렬이 이루어 집니다.
using namespace std;
template <typename T>
class algorithm{
private:
void swap(T& a, T& b){
T tmp = a;
a = b;
b = tmp;
}
void sort(T* array_list, int left, int mid, int right){
T sorted[right - left];
int low = left;
int high = mid;
int index = 0;
while(low < mid && high < right){
if(array_list[low] > array_list[high])
sorted[index] = array_list[high++];
else
sorted[index] = array_list[low++];
index += 1;
}
while(low < mid)
sorted[index++] = array_list[low++];
while(high < right)
sorted[index++] = array_list[high++];
for(int i = left; i < right; i++){
array_list[i] = sorted[i - left];
}
}
public:
void merge_sort(T* array_list, int left, int right){
if(left >= right - 1) return;
int mid = (left + right) / 2;
merge_sort(array_list, left, mid);
merge_sort(array_list, mid, right);
sort(array_list, left, mid, right);
}
};
'ALGORITHM_PRACTICE' 카테고리의 다른 글
[C++] 퀵 소트(Quick Sort) 구현 (0) | 2019.12.18 |
---|---|
[C++] 계산기 구현 (1) | 2019.12.17 |
최대공약수(gcd), 최소공배수(lcm) (0) | 2019.12.13 |
[프로그래머스] 최고의 집합 (0) | 2019.12.11 |
[프로그래머스] 방문 길이 (0) | 2019.12.08 |