[C++ STL과 알고리즘] 벡터의 merge sort 공부하기

2022. 1. 13. 01:04Programming Language/.Cpp

 

 

Merge Sort?

: 주어진 문제를 반으로 분할하고 해결한 뒤 다시 병합하는 분할 정복 알고리즘  


https://www.youtube.com/watch?v=ctkuGoJPmAE

나동빈님의 merge sort 튜토리얼을 보고 merge sort 배열의 구현에는 성공했다. 

다음 단계로, 벡터 컨테이너 클래스로 merge sort를 구현하는 것을 시도했다.

 

#include <iostream>
#include <vector>
#include <string>
#include <algorithm> 

using namespace std;

vector<int>sorted; //정렬된 데이터를 저장할 벡터 선언

/* 
i: 분할 후 왼쪽 리스트
j: 분할 후 오른쪽 리스트
k: 복사할 배열의 인덱스
*/

void merge(vector<int>& v, int start, int mid, int end)
{	
	int i = start;
	int j = mid + 1; //분할한 지점 +1의 인덱스
	int k = start; //시작 지점

	//작은 순서대로 삽입
	while (i <= mid && j <= end) // 중간점과 배열의 끝 전에 닿기까지 진행
	{
		if (v[i] <= v[j]) {
			sorted[k] = v[i];
			i++;
		}
		else { // a[i] > a[j]
			sorted[k] = v[j];
			j++;
		}
		k++;
	}

	int entry = (i > mid) ? j : i;
	int target = (i > mid) ? end : mid;

	for (int t = entry; t <= target; ++t)
	{
		sorted[k] = v[t];
		k++;
	}
	//임시리스트를 원래 리스트에 복사
	for (int t = start; t <= end; t++) v[t] = sorted[t];
}

void mergeSort(vector<int>& v, int start, int end) {
	if (sorted.size() == 0) sorted = vector<int>(v.size());
	if (start < end) {
		int mid = (start + end) / 2;
		mergeSort(v, start, mid);
		mergeSort(v, mid+1, end);
		merge(v, start, mid, end);
	}
}


int main() {
	int n;
	cin >> n;
	vector<int> v(n);
	for (int i = 0; i < n; i++)
	{
		cin >> v[i];
	}
	mergeSort(v, 0, v.size() - 1);
	for (const auto& e:v) //벡터 v의 element를 반복자를 쓴 것처럼 호출..
	{
		cout << e;
	}
}

 

https://velog.io/@cgotjh/%EB%B3%91%ED%95%A9-%EC%A0%95%EB%A0%ACMerge-Sort

https://blockdmask.tistory.com/384

http://www.cplusplus.com/forum/beginner/252949/

 

const auto& for loop - C++ Forum

Hello, in which cases is it necessary to use a for loop on the form 123 for(const auto &i : vec){ std::cout << i << std::endl; } rather than on the form 123 for(auto i : vec){ std::cout << i << std::endl; } I know the last one results in a copy of each ele

www.cplusplus.com

merge와 mergeSort의 매개변수로 벡터를 받을 때, 참조자를 붙이자. 그렇게하고 나면, 따로 정렬한 벡터를 반환하거나 하지 않아도 v[t] = sorted[t]라는 for loop를 통해서, 정렬한 element 값들이 vector에 자리를 찾아가게 된다. 

main함수에서 auto 키워드로 for loop statement cin >> elem은 불가능

 

'Programming Language > .Cpp' 카테고리의 다른 글

[C++] BOJ 15889번 : 호 안에 수류탄이야!!  (0) 2022.01.13
[C++] BOJ 11582번 : 치킨 TOP N  (0) 2022.01.13
[C++] BOJ 1026번 : 보물  (0) 2022.01.09
연산자 오버로딩  (0) 2021.12.27
[C++] 1.10 선언과 정의  (0) 2021.03.17