Quick Sort
#include <iostream>
#include <vector>
#include <string>
using namespace std;
// 기준점 Pivot 보다 작으면 왼쪽으로, 크면 오른쪽으로 swap하는 분할 함수
int Partition(string& str, int Left, int Right)
{
char Pivot = str[Right]; // 마지막 요소를 기준 pivot으로 설정
int i = Left - 1; // 작은 요소의 인덱스
for (int j = Left; j <= Right; ++j)
{
// 오름차순 정렬
if (str[j] < Pivot)
{
i++;
swap(str[i], str[j]); // 작은 요소를 왼쪽으로 이동
}
}
swap(str[i + 1], str[Right]); // 기준이 되었던 Pivot 요소 값을 확정 위치로 swap.
// str[i+1]보다 앞의 값들은 Pivot요소보다 작음.
return i + 1; // 확정된 위치 인덱스 반환
}
void QuickSort(string& str, int Left, int Right)
{
if (Left < Right)
{
int Pivot = Partition(str, Left, Right); // 분할하여 확정된 자리 인덱스 값 저장.
QuickSort(str, Left, Pivot - 1); // 확정된 자리의 왼쪽 값들 재귀호출로 정렬.
QuickSort(str, Pivot + 1, Right); // 확정된 자리의 오른쪽 값들 재귀호출로 정렬.
}
}
int main()
{
string Str = "aBcDeF";
QuickSort(Str, 0, Str.size() - 1);
cout << Str;
return 0;
}
퀵솔트는 평균적으로 O(n log n)의 속도를 가진 정렬 알고리즘이며, 최악의 경우엔 O(n2)이다.
- 오름차순으로 정렬한다고 가정했을 때, Pivot을 하나 정해서 왼쪽에는 Pivot보다 작은 값들을, 오른쪽엔 Pivot보다 큰 값들을 정렬해 분할한다.
- 이후 Pivot의 자리가 정해졌기 때문에 요소의 시작부터 Pivot - 1의 자리까지, Pivot + 1의 자리부터 요소의 끝까지 재귀호출을 하며 반복적으로 하나씩 자리를 확정해나가며 정렬한다.
'내배캠 > C++' 카테고리의 다른 글
Stack / Static / Heap (2) | 2024.12.24 |
---|---|
가상 함수와 추상 클래스 (0) | 2024.12.24 |
유클리드 알고리즘 (1) | 2024.12.23 |
Class (0) | 2024.12.23 |
set 과 unordered_set (0) | 2024.12.22 |