CS/์•Œ๊ณ ๋ฆฌ์ฆ˜

[์•Œ๊ณ ๋ฆฌ์ฆ˜] ํ€ต ์ •๋ ฌ(Quick Sort)

๋ฒผ๋ฆฌ01 2024. 5. 31. 15:11

๐Ÿ“Œํ€ต ์ •๋ ฌ์ด๋ž€?

๊ฐ€์žฅ ๋น ๋ฅธ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ค‘ ํ•˜๋‚˜. ๋ถ„ํ•  ์ •๋ณต ๋ฐฉ๋ฒ•์ด ์ ์šฉ๋œ ์•Œ๊ณ ๋ฆฌ์ฆ˜. ์ฐฐ์Šค ์•คํ„ฐ๋‹ˆ ๋ฆฌ์ฒ˜๋“œ ํ˜ธ์–ด(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;
}