quickSort

Quick Sort

ํ€ต ์ •๋ ฌ (Quick Sort)

: ํŠน์ •ํ•œ ๊ฐ’์„ ๊ธฐ์ค€(ํ”ผ๋ฒ—)์œผ๋กœ ํฐ ์ˆซ์ž์™€ ์ž‘์€ ์ˆซ์ž๋ฅผ ์„œ๋ฃŒ ๊ตํ™˜ํ•œ ๋’ค์— ๋ฐฐ์—ด์„ ๋ฐ˜์œผ๋กœ ๋‚˜๋ˆˆ๋‹ค

  • ๋Œ€ํ‘œ์ ์ธ ๋ถ„ํ•  ์ •๋ณต ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ‰๊ท  ์†๋„๊ฐ€ O(N*logN)์ด๋‹ค

  • ํ•˜์ง€๋งŒ ํ€ต ์ •๋ ฌ ์ตœ์•… ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” O(N^2)์ด๋‹ค

์ •๋ ฌ ๋ฐฉ๋ฒ•

ํ€ต ์ •๋ ฌ์€ ๋ถ„ํ•  ์ •๋ณต(divide and conquer) ๋ฐฉ๋ฒ•์„ ํ†ตํ•ด ๋ฆฌ์ŠคํŠธ๋ฅผ ์ •๋ ฌํ•œ๋‹ค. 1. ๋ฆฌ์ŠคํŠธ ๊ฐ€์šด๋ฐ์„œ ํ•˜๋‚˜์˜ ์›์†Œ๋ฅผ ๊ณ ๋ฅธ๋‹ค. ์ด๋ ‡๊ฒŒ ๊ณ ๋ฅธ ์›์†Œ๋ฅผ ํ”ผ๋ฒ—์ด๋ผ๊ณ  ํ•œ๋‹ค. 2. ํ”ผ๋ฒ— ์•ž์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ๊ฐ’์ด ์ž‘์€ ๋ชจ๋“  ์›์†Œ๋“ค์ด ์˜ค๊ณ , ํ”ผ๋ฒ— ๋’ค์—๋Š” ํ”ผ๋ฒ—๋ณด๋‹ค ๊ฐ’์ด ํฐ ๋ชจ๋“  ์›์†Œ๋“ค์ด ์˜ค๋„๋ก ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘˜๋กœ ๋‚˜๋ˆˆ๋‹ค. ์ด๋ ‡๊ฒŒ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋‘˜๋กœ ๋‚˜๋ˆ„๋Š” ๊ฒƒ์„ ๋ถ„ํ• ์ด๋ผ๊ณ  ํ•œ๋‹ค. ๋ถ„ํ• ์„ ๋งˆ์นœ ๋’ค์— ํ”ผ๋ฒ—์€ ๋” ์ด์ƒ ์›€์ง์ด์ง€ ์•Š๋Š”๋‹ค. 3. ๋ถ„ํ• ๋œ ๋‘ ๊ฐœ์˜ ์ž‘์€ ๋ฆฌ์ŠคํŠธ์— ๋Œ€ํ•ด ์žฌ๊ท€(Recursion)์ ์œผ๋กœ ์ด ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•œ๋‹ค. ์žฌ๊ท€๋Š” ๋ฆฌ์ŠคํŠธ์˜ ํฌ๊ธฐ๊ฐ€ 0์ด๋‚˜ 1์ด ๋  ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋œ๋‹ค. ์žฌ๊ท€ ํ˜ธ์ถœ์ด ํ•œ๋ฒˆ ์ง„ํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ตœ์†Œํ•œ ํ•˜๋‚˜์˜ ์›์†Œ๋Š” ์ตœ์ข…์ ์œผ๋กœ ์œ„์น˜๊ฐ€ ์ •ํ•ด์ง€๋ฏ€๋กœ, ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๋ฐ˜๋“œ์‹œ ๋๋‚œ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

QuickSort
public class QuickSort {
    // a[idx1]์™€ a[idx2]์˜ ๊ฐ’์„ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.
    static void swap(int[] a, int idx1, int idx2) {
        int t = a[idx1];
        a[idx1] = a[idx2];
        a[idx2] = t;
    }

    // ํ€ต ์ •๋ ฌ
    static void quickSort(int[] a, int left, int right) {
        int pl = left; // ์™ผ์ชฝ ์ปค์„œ
        int pr = right; // ์˜ค๋ฅธ์ชฝ ์ปค์„œ
        int x = a[(pl + pr) / 2]; // ํ”ผ๋ฒ—

        do {
            while (a[pl] < x)
                pl++;
            while (a[pr] > x)
                pr--;
            if (pl <= pr)
                swap(a, pl++, pr--);
        } while (pl <= pr);

        if (left < pr)
            quickSort(a, left, pr);
        if (pl < right)
            quickSort(a, pl, right);
    }

    public static void main(String[] args) {
        int[] x = { 1, 10, 5, 8, 7, 6, 4, 3, 2, 9 };

        quickSort(x, 0, x.length - 1); // ๋ฐฐ์—ด x๋ฅผ ํ€ต ์ •๋ ฌ

        for (int i = 0; i <  x.length; i++)
            System.out.println("x[" + i + "]๏ผ" + x[i]);
    }
}
array = [1, 10, 5, 8, 7, 6, 4, 3, 2, 9]

def quick_sort(array, start, end):
    if start >= end: # ์›์†Œ๊ฐ€ 1๊ฐœ์ธ ๊ฒฝ์šฐ ์ข…๋ฃŒ
        return
    pivot = start # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    left = start + 1
    right = end
    while(left <= right):
        # ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต 
        while(left <= end and array[left] <= array[pivot]):
            left += 1
        # ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต
        while(right > start and array[right] >= array[pivot]):
            right -= 1
        if(left > right): # ์—‡๊ฐˆ๋ ธ๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํ”ผ๋ฒ—์„ ๊ต์ฒด
            array[right], array[pivot] = array[pivot], array[right]
        else: # ์—‡๊ฐˆ๋ฆฌ์ง€ ์•Š์•˜๋‹ค๋ฉด ์ž‘์€ ๋ฐ์ดํ„ฐ์™€ ํฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฒด
            array[left], array[right] = array[right], array[left]
    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ ์ˆ˜ํ–‰
    quick_sort(array, start, right - 1)
    quick_sort(array, right + 1, end)

quick_sort(array, 0, len(array) - 1)
print(array)
  • ํŒŒ์ด์ฌ ๋ฌธ๋ฒ• ์‘์šฉ์œผ๋กœ ๊ตฌํ˜„ํ•œ ํ€ต์ •๋ ฌ

array = [1, 10, 5, 8, 7, 6, 4, 3, 2, 9]

def quick_sort(array):
    # ๋ฆฌ์ŠคํŠธ๊ฐ€ ํ•˜๋‚˜ ์ดํ•˜์˜ ์›์†Œ๋งŒ์„ ๋‹ด๊ณ  ์žˆ๋‹ค๋ฉด ์ข…๋ฃŒ
    if len(array) <= 1:
        return array

    pivot = array[0] # ํ”ผ๋ฒ—์€ ์ฒซ ๋ฒˆ์งธ ์›์†Œ
    tail = array[1:] # ํ”ผ๋ฒ—์„ ์ œ์™ธํ•œ ๋ฆฌ์ŠคํŠธ

    left_side = [x for x in tail if x <= pivot] # ๋ถ„ํ• ๋œ ์™ผ์ชฝ ๋ถ€๋ถ„
    right_side = [x for x in tail if x > pivot] # ๋ถ„ํ• ๋œ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„

    # ๋ถ„ํ•  ์ดํ›„ ์™ผ์ชฝ ๋ถ€๋ถ„๊ณผ ์˜ค๋ฅธ์ชฝ ๋ถ€๋ถ„์—์„œ ๊ฐ๊ฐ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ์ „์ฒด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜
    return quick_sort(left_side) + [pivot] + quick_sort(right_side)

print(quick_sort(array))

Reference : Wikipedia

Last updated

Was this helpful?