C++/자료구조

[C++] 정렬 #3 병합 정렬 & 퀵 정렬 (Merge Sort & Quick Sort)

노랑꼬리 2023. 7. 3. 12:16

목차

※ 정렬 #1 버블 정렬 & 선택 정렬

※ 정렬 #2 삽입 정렬 & 힙 정렬

 

1. 분할 정복 알고리즘

2. 병합 정렬 (Merge Sort)

3. 퀵 정렬 (Quick Sort)


1. 분할 정복 알고리즘

- 엄청나게 크고 방대한 문제를 나누어 쉽게 풀 수 있는 작은 크기로 나누어 문제를 해결 한 뒤 합쳐서 해결하는 방식이다.

- 어려운 문제를 간단하고 빠르게 해결 할 수 있다.

- 함수 재귀 호출을 이용하여 구현하므로 오버플로가 발생할 수 있고 쪼갠 문제를 저장해야 하므로 메모리 사용량이 크다.

 

※ 3가지 단계를 거쳐 해결한다.

 

가. 분할: 문제를 더이상 분할할 수 없을 때까지 동일한 유형의 여러 하위 문제로 나눈다.

나. 정복: 가장 작은 단위의 하위 문제를 해결하여 정복한다.

다. 조합: 하위 문제에 대한 결과를 원래 문제에 대한 결과로 조합한다.

 

※ 분할 정복을 사용하는 대표적인 알고리즘

- 병합 정렬, 퀵 정렬

- 고속 푸리에 변환

 

 

2. 병합 정렬 (Merge Sort)

- 분할 정복 알고리즘

- 배열의 가운데를 기준으로 반으로 나누어 분할 한다. (나뉜 배열에도 재귀로 더이상 나눌수 없을 때 까지 반복한다)

- 나뉜 배열을 정렬 기준에 따라 정렬하고 합병하여 다시 정렬하기를 반복한다.

병합 정렬 애니메이션 (출처 : 위키백과)

 

 

가. 구현하기

병합 정렬 결과

 

3. 퀵 정렬 (Quick Sort)

- 분할 정복 알고리즘

- 배열의 첫번째 요소를 기준(피벗 : pivot)으로 비교해 두 파티션으로 분리해 나눈다 

- 나뉜 두 배열에 대해서도 해당 배열의 첫번째 요소를 기준으로 나누는 것을 반복하여 배열의 길이가 0 또는 1이 될 때 까지 반복한다.

- 한번 나뉠 때 마다(재귀 1회마다) 피벗의 위치는 정해진다.

 

가. 구현하기

 

 ※ 참조

위키 백과 합병 정렬

https://ko.wikipedia.org/wiki/%ED%95%A9%EB%B3%91_%EC%A0%95%EB%A0%AC

위키 백과 퀵 정렬

https://ko.wikipedia.org/wiki/%ED%80%B5_%EC%A0%95%EB%A0%AC