๐Ÿ”ฅ ํ€ต์ •๋ ฌ ๋„ˆ ๋ˆ„๊ตฌ์•ผ

Haloยท2025๋…„ 9์›” 17์ผ
0

Algorithm

๋ชฉ๋ก ๋ณด๊ธฐ
80/85
post-thumbnail

1. ์–ด๋””์„œ ๋‚˜์™”๋‹ˆ?

๋ณดํ†ต ์ž๋ฐ”์˜ Arrays.sort(arr)์€ Dual-Pivot QuickSort์„ ์“ด๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด QuickSort๋Š” ๋ฌด์—‡์ผ๊นŒ? ํ•œ๋ฒˆ ์•Œ์•„๋ณด๋„๋ก ํ•˜์ž.

2. ํ€ต์ •๋ ฌ์ด๋ž€?

ํ€ต ์ •๋ ฌ์ด๋ž€ ํŠน์ • ํ”ผ๋ฒ— ๊ธฐ์ค€์œผ๋กœ ์™ผ์ชฝ์€ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€๊ฐ’ ์˜ค๋ฅธ์ชฝ์€ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์ •๋ ฌํ•ด๋‚˜๊ฐ€๋Š” ๋ฐฉ๋ฒ•์ด๋‹ค.


ํ”ผ๋ฒ—์€ ์ค‘์•™๊ฐ’์ธ 5๋กœ ์žก์•˜์„ ๋•Œ, ์œ„์˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ start์™€ end๋ฅผ ์–‘ ๋๋‹จ์œผ๋กœ ์žก๋Š”๋‹ค.

๊ทธ๋ฆฌ๊ณ  start๋ฅผ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์€ ๊ฐ’์ด๋ฉด ๊ณ„์† ++๋ฅผ ์‹œ์ผœ์ค€๋‹ค. ๋งŒ์•ฝ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์ด์ด ๋‚˜์˜จ๋‹ค๋ฉด ๋ฉˆ์ถ˜๋‹ค.

while(start<pivot) -> start++ ์ด๋Ÿฐ์‹์œผ๋กœ ๊ตฌํ˜„

๋˜ํ•œ end๋ฅผ ํ”ผ๋ฒ—๋ณด๋‹ค ํฐ ๊ฐ’์ด๋ฉด ๊ณ„์† --๋ฅผ ์‹œ์ผœ์ฃผ๊ณ  ๋งŒ์•ฝ ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์ด ๋‚˜์˜จ๋‹ค๋ฉด ๋ฉˆ์ถ˜๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์•„๋ž˜ ์‚ฌ์ง„์ฒ˜๋Ÿผ ์„œ๋กœ ์Šค์™‘ํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  s์™€ e๊ฐ€ ๊ฐ™์•„์ง€๋ฉด ํ•œ ์‚ฌ์ดํด์ด ์ข…๋ฃŒ๋œ ๊ฒƒ์ด๋‹ค.

์ฒซ๋ฒˆ์งธ ์‚ฌ์ดํด์ด ๋Œ๋ฉด ํ”ผ๋ฒ—์„ ๊ธฐ์ค€์œผ๋กœ ์ •๋ ฌ๋œ ์–‘์ชฝ ๊ตฌ๊ฐ„์—์„œ ๋˜ ๊ฐ์ž์˜ ํ”ผ๋ฒ—์„ ์ •ํ•˜๊ณ  ํ•œ๋ฒˆ ๋” ์‹คํ–‰๋œ๋‹ค. ๋งŒ์•ฝ ์™ผ์ชฝ ๊ตฌ์—ญ์ด ํ•˜๋‚˜๊ฐ€ ๋‚จ๊ฑฐ๋‚˜ ์˜ค๋ฅธ์ชฝ ๊ตฌ์—ญ์ด ํ•˜๋‚˜๊ฐ€ ๋‚จ์•˜์„ ์‹œ, ํ•ด๋‹น ๋ถ€๋ถ„์€ ํ€ต์†ŒํŠธ๋ฅผ ๋” ์ด์ƒ ํ•˜์ง€ ์•Š๋Š”๋‹ค. ์•„๋ž˜์™€ ๊ฐ™์€ ์ƒํ•ญ์ด ๊ทธ ์˜ˆ์‹œ์ด๋‹ค.

๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ๊ณ„์† ํ€ต์ •๋ ฌ๋ฅผ ํ•˜๋‹ค๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ํŠธ๋ฆฌ๊ฐ€ ์™„์„ฑ๋œ๋‹ค.

๋งจ ์ฒ˜์Œ ์‚ฌ์ง„์ธ ๊ฒฝ์šฐ๋Š” QuickSort(0,0)์ผ ๊ฒƒ์ด๊ณ  ํ•ด๋‹น ์Šคํƒ‘ ์กฐ๊ฑด์€ start<pivot-1 ์ด๋Ÿฐ์‹์œผ๋กœ ๋  ๊ฒƒ์ด๋‹ค.

3. ์‹œ๊ฐ„๋ณต์žก๋„

์œ„์™€ ๊ฐ™์€ ํŠธ๋ฆฌ์˜ ํ˜•ํƒœ๋กœ ๋ณด์•˜์„ ๋•Œ, ์‹œ๊ฐ„ ๋ณต์žก๋„๋Š” nlogn์ด ๋‚˜์˜ค๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

4. ์ˆ˜๋„ ์ฝ”๋“œ

๊ฐ€. Partition์—์„œ Swap
1) pivot์„ ๋ฐฐ์—ด์˜ ์ค‘์•™ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•œ๋‹ค.
2) start์™€ end๋ฅผ 0 ๊ทธ๋ฆฌ๊ณ  ๋ฐฐ์—ด์˜ ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋กœ ํ• ๋‹นํ•œ๋‹ค.
3) arr[start]๊ฐ€ ํ”ผ๋ฒ—๋ณด๋‹ค ์ž‘์œผ๋ฉด start++
4) arr[end]๊ฐ€ ํ”ผ๋ฒ—๋ณด๋‹ค ํฌ๋ฉด end--
6) start์™€ end๊ฐ€ stop๋˜๊ณ , start<=end๋ผ๋ฉด arr[start]์™€ arr[end]๋ฅผ swapํ•œ๋‹ค.
7) ์œ„ ๊ณผ์ •์„ start<=end๋™์•ˆ ๋ฐ˜๋ณตํ•œ๋‹ค.
8) start๋ฅผ Returnํ•œ๋‹ค.

โ“ : ์™œ Start๋ฅผ Returnํ• ๊นŒ?
ํŒŒํ‹ฐ์…˜ ์•ˆ์—์„œ ์Šค์™‘์ด ์ด๋ฃจ์–ด์ง€๊ณ , ๊ฒฐ๊ตญ 2๊ฐœ๋กœ ๋‚˜๋ˆ ์ง„ ์ฒซ๋ฒˆ์งธ ๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค๋ฅผ start๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

๋‚˜. ์ „์ฒด์ ์ธ ํ๋ฆ„
1) ํŒŒํ‹ฐ์…˜ ์ง„ํ–‰
2) ํŒŒํ‹ฐ์…˜ ํ›„ ์™ผ์ชฝ๋ฐฐ์—ด์˜ ์›์†Œ๊ฐ€ 2๊ฐœ ์ด์ƒ์ด๋ฉด ๋‹ค์‹œ ํ€ต์†ŒํŠธ๋ฅผ ์žฌ๊ท€์ ์œผ๋กœ ํ˜ธ์ถœํ•ด์„œ ํŒŒํ‹ฐ์…˜์„ ์ง„ํ–‰ํ•œ๋‹ค.
3) ์˜ค๋ฅธ์ชฝ๋„ 3๋ฒˆ๊ณผ ๋™์ผ

๐Ÿ’ก ๊ทธ๋ ‡๋‹ค ์žฌ๊ท€ = ํŠธ๋ฆฌ์ด๋ฏ€๋กœ ํŠธ๋ฆฌํ˜•ํƒœ๋กœ ํ€ต์†ŒํŠธ๊ฐ€ ์ง„ํ–‰๋œ๋‹ค.

5. ์ฝ”๋“œ

import java.util.Arrays;

public class P19 {

    static void quickSort(int[] arr){
        quickSort(arr, 0, arr.length-1);
    }

    static void quickSort(int[] arr, int start, int end) {
        int part2 = partition(arr,start,end); // part2 : ๋‘๋ฒˆ์งธ ๋ฐฐ์—ด์˜ ์ฒซ๋ฒˆ์งธ idx
        if(start+1<part2){
            partition(arr,start,part2-1);
        }
        if(part2<end){
            partition(arr,part2,end);
        }

    }
    static int partition(int[] arr, int start, int end){
        int pivot = arr[(arr[start]+arr[end])/2];

        while(start<=end){
            while(arr[start]<pivot) start++;
            while(arr[end]>pivot) end--;
            if(start<=end){
                swap(arr, start, end);
                start++;
                end--;
            }
        }

        return start;
    }

    static void swap(int[] arr, int start, int end){
        int tmp = arr[start];
        arr[start] = arr[end];
        arr[end] = tmp;
    }

    public static void main(String[] args) {
        int[] arr = new int[]{2,3,4,1};
        quickSort(arr);
        System.out.println(Arrays.toString(arr));

    }
}

profile
์ƒˆ๋ผ ๊ณ ์–‘์ด ํ‚ค์šฐ๊ณ  ์‹ถ๋‹ค

0๊ฐœ์˜ ๋Œ“๊ธ€