๐ํต ์ ๋ ฌ์ด๋?
๊ฐ์ฅ ๋น ๋ฅธ ์ ๋ ฌ ์๊ณ ๋ฆฌ์ฆ ์ค ํ๋. ๋ถํ ์ ๋ณต ๋ฐฉ๋ฒ์ด ์ ์ฉ๋ ์๊ณ ๋ฆฌ์ฆ. ์ฐฐ์ค ์คํฐ๋ ๋ฆฌ์ฒ๋ ํธ์ด(C. A. R. Hoare)๊ฐ ์๊ณ ๋ฆฌ์ฆ์ ์ ๋ ฌ ์๋๊ฐ ๋งค์ฐ ๋น ๋ฅด๋ค๊ณ ํด์ ๋ถ์ธ ์ด๋ฆ์ด๋ค. ๋ฐฐ์ด ๋ด์ ํน์ ๋ฐ์ดํฐ(pivot)๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ๋ฐ์ดํฐ๋ค์ ์ผ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด๊ณผ ์ค๋ฅธ์ชฝ ๋ถ๋ถ ๋ฐฐ์ด๋ก ๋๋์ด ๊ฐ ๋ถ๋ถ ๋ฐฐ์ด์ ๋ํด ํต ์ ๋ ฌ์ ์ํ์ผ๋ก ์ ์ฉํ์ฌ ๋ฐฐ์ด ์ ์ฒด๋ฅผ ์ ๋ ฌํ๋ค.
๐์๊ฐ ๋ณต์ก๋
์ต์ : O(n^2) ์ด๋ฏธ ์ ๋ ฌ๋์ด ์๋ ๋ฐฐ์ด์ ์ ๋ ฌํ ๊ฒฝ์ฐ
์ต์ : O(n log n)
ํ๊ท : O(n log n)
๐ํ๋ฆ
1. ์ ๋ ฅ๋ ๋ฐ์ดํฐ ์๊ฐ n์ธ ๋ฐฐ์ด `arr`๊ฐ ์์ ๋ `arr` ๋ด ์์์ ๋ฐ์ดํฐ ํผ๋ฒ(pivot)์ ์ ํ๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ฐฐ์ด์ ์ฒซ๋ฒ์งธ ๋ฐ์ดํฐ(`arr[0]`)๊ฐ ๋๋ค.
2. ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ์ผ์ชฝ ๋ฐฐ์ด(ํผ๋ฒ๋ณด๋ค ์์ ๋ฐฐ์ด)๊ณผ ์ค๋ฅธ์ชฝ ๋ฐฐ์ด(ํผ๋ฒ๋ณด๋ค ํฐ ๋ฐฐ์ด)๋ก ๋๋๋ค.
2-1. ์ ์ํ ๋ณ์ `left`๋ฅผ 1, `right`๋ฅผ n-1๋ก ์ ์ธํ๋ค.
2-2. `left`๋ 1์ฉ ์ฆ๊ฐํ๋ฉด์ ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.(ํผ๋ฒ๋ณด๋ค ํฐ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๊ฐ ๋๋ค.)
2-3. `right`๋ 1์ฉ ๊ฐ์ํ๋ฉด์ ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ฐพ๋๋ค.(ํผ๋ฒ๋ณด๋ค ์์ ๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ์ ์ธ๋ฑ์ค๊ฐ ๋๋ค.)
2-4. ์์ 2์ 3 ๊ณผ์ ์ ๋ง์กฑํ์ผ๋ฉด `arr[left]`์ ์์น์ `arr[right]`์ ์์น๋ฅผ ์๋ก ๊ตํํ๋ค.
2-5. `left`์ `right`๊ฐ ์๋ก ๋์ผํ ๊ฐ์ด ๋์์ ๋, ์ฆ `arr[left]`์ `arr[right]`๊ฐ ๊ฐ์ ์์๋ฅผ ๊ฐ๋ฆฌํค๋ฉด *`arr[left]`์ `arr[right]`๋ฅผ ๊ตํํ๋ค.
3. `left`๊ฐ `right`๋ณด๋ค ์ปค์ง๋ฉด ํผ๋ฒ(`arr[0]`)๊ณผ `arr[right]`๋ฅผ ๊ตํํ๋ค.
4. ์ผ์ชฝ ๋ฐฐ์ด๊ณผ ์ค๋ฅธ์ชฝ ๋ฐฐ์ด์ ๋ํด ํต ์ ๋ ฌ์ ์ฌ๊ท ํธ์ถํ๋ค.
*๋์ผํ ์์๋ฅผ ๊ตํํ๋ ์๋๊ฐ ์๋ฏธ ์์ด ๋ณด์ผ ์ ์์ผ๋ ์ด ์๋๋ ์๋ฌด๋ฆฌ ๋ง์์ผ 1ํ์ด๋ฏ๋ก `left`์ `right`๊ฐ ๋์ผํ ์์ ์์ ์๋์ง ๊ฒ์ฌํ๋ ๋น์ฉ๋ณด๋ค ์ ๋ค.
๐๊ตฌํ
์ธ์ด: C++
#include <iostream>
using namespace std;
template <class T>
void Swap(T* a, T* b) {
T temp = *a;
*a = *b;
*b = temp;
}
template <class T>
void QuickSort(T* arr, int low, int high) {
if (low >= high) return; // ์ข
๋ฃ ์กฐ๊ฑด
T pivot = arr[high]; // ํผ๋ฒ์ ๋งจ ์ค๋ฅธ์ชฝ ์์๋ก ์ค์
int left = low;
int right = high - 1; // ํผ๋ฒ ์ ์ธ
while (left <= right) {
// ํผ๋ฒ๋ณด๋ค ์์ผ๋ฉด ์ปค์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ด๋
while (left <= right && arr[left] < pivot) left++;
// ํผ๋ฒ๋ณด๋ค ํฌ๋ฉด ์ปค์ ์ผ์ชฝ์ผ๋ก ์ด๋
while (left <= right && arr[right] > pivot) right--;
if (left <= right) {
Swap(&arr[left], &arr[right]);
left++;
right--;
}
}
// ํผ๋ฒ ์ด๋
Swap(&arr[left], &arr[high]);
// ํผ๋ฒ์ ๊ธฐ์ค์ผ๋ก ๋ ๋ถ๋ถ์ผ๋ก ๋๋์ด ์ฌ๊ท ํธ์ถ
if (low < left - 1) QuickSort(arr, low, left - 1);
if (left + 1 < high) QuickSort(arr, left + 1, high);
}
int main() {
int arr[] = { 9, 6, 7, 3, 5 };
int size = sizeof(arr) / sizeof(arr[0]);
QuickSort(arr, 0, size - 1);
for (int i = 0; i < size; i++) {
cout << arr[i] << " ";
}
cout << endl;
return 0;
}
'CS > ์๊ณ ๋ฆฌ์ฆ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์๊ณ ๋ฆฌ์ฆ] ์ด์ง ํ์(์ด๋ถ ํ์) (0) | 2024.08.09 |
---|---|
[์๊ณ ๋ฆฌ์ฆ] ํ ์ ๋ ฌ(Heap Sort) (0) | 2024.05.31 |
[์๊ณ ๋ฆฌ์ฆ] ์๊ณ ๋ฆฌ์ฆ์ด๋? (0) | 2024.03.11 |