Skip to main content Link Menu Expand (external link) Document Search Copy Copied

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

Table of contents

  1. ์˜ˆ์‹œ
  2. ์ฝ”๋“œ
  3. ์™„์„ฑ ์ฝ”๋“œ

์ด๋ฏธ ์ •๋ ฌ์ด ๋งŽ์ด ๋˜์–ด์žˆ๋Š” ์ƒํƒœ์—์„œ๋Š”, ์‹œ๊ฐ„๋ณต์žก๋„๊ฐ€ ์ปค์งˆ ์ˆ˜ ์žˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์žฅ ๋น ๋ฅธ ์ •๋ ฌ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ฉด, ๊ธฐ์ค€ ๊ฐ’์„ ํ•˜๋‚˜ ์ •ํ•˜๊ณ , start index 0์—์„œ๋ถ€ํ„ฐ ๊ธฐ์ค€๊ฐ’๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ’์„ ๋ฐœ๊ฒฌํ•˜๊ณ , end index ๋์—์„œ๋ถ€ํ„ฐ ๊ธฐ์ค€๊ฐ’๋ณด๋‹ค ์ž‘๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๋ฐœ๊ฒฌํ•  ์‹œ, ๋‘์ˆ˜์˜ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•˜๊ณ , start ์ธ๋ฑ์Šค๋Š” +1 end ์ธ๋ฑ์Šค๋Š” -1์„ ํ•˜๊ณ ,

start index์™€ end index๊ฐ€ ๋งŒ๋‚ ๋•Œ ๊นŒ์ง€ ๊ตํ™˜์„ ์ˆ˜ํ–‰ํ•˜๊ณ , ๋ฃจํ”„๊ฐ€ ๋๋‚œ ๋’ค start index์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌํ•˜์—ฌ ๋˜ ์œ„์™€๊ฐ™์€ ๋ฃจํ”„๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์ด ๋‚˜์˜ค๊ฒŒ ๋œ๋‹ค.


์˜ˆ์‹œ


[5] 3 8 (9) 2 4 {7}

( [ ] = ์‹œ์ž‘์ธ๋ฑ์Šค ( ) = ๊ธฐ์ค€๊ฐ’ { } = ๋ ์ธ๋ฑ์Šค )

์‹œ์ž‘ ์ธ๋ฑ์Šค 5, ๊ธฐ์ค€๊ฐ’ 9 ๋ ์ธ๋ฑ์Šค 7 ์ธ ๋ฐฐ์—ด์ด ์žˆ์„ ๋•Œ


5 3 8 [(9)] 2 4 {7}

์‹œ์ž‘ ์ธ๋ฑ์Šค๋Š” ๊ธฐ์ค€๊ฐ’๊ณผ ๊ฐ’์ด ๊ฐ™์€ 9์—์„œ ๋ฉˆ์ถค, ๋ ์ธ๋ฑ์Šค๋Š” ๊ธฐ์ค€๊ฐ’๋ณด๋‹ค ์ž‘์€ 7์—์„œ ๋ฉˆ์ถค, ๋‘ ์ˆ˜๋ฅผ ๊ตํ™˜

๊ธฐ์ค€ ๊ฐ’์€ 7๋กœ ๋ฐ”๋€” ๊ฒƒ์ด๋‹ค.


5 3 8 (7) 2 {4} [9]

์‹œ์ž‘ ์ธ๋ฑ์Šค๋Š” 7๋ณด๋‹ค ๊ทธ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•ด ๊ฒฐ๊ตญ 9๊นŒ์ง€ ์™”๊ณ , ๋ ์ธ๋ฑ์Šค๋Š” 7๋ณด๋‹ค ์ž‘์€ 4๋ฅผ ๋ฐœ๊ฒฌํ–ˆ์ง€๋งŒ, ์ด๋ฏธ ์‹œ์ž‘ ์ธ๋ฑ์Šค์™€ ๋ ์ธ๋ฑ์Šค๊ฐ€ ๋งŒ๋‚˜ ๊ต์ฐจํ•œ ๋’ค ๋ฐœ๊ฒฌํ–ˆ์œผ๋ฏ€๋กœ ๊ตํ™˜์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์Œ

์‹œ์ž‘ ์ธ๋ฑ์Šค์˜ ์œ„์น˜๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณต๊ฐ„์„ ๋ถ„๋ฆฌํ•œ๋‹ค.


[5] 3 (8) 7 2 {4}  ||  9

9๋Š” ๊ฐ’์ด 1๊ฐœ์ด๋ฏ€๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.


5 3 [(8)] 7 2 {4} ||  9

์œ„ ๊ฒฝ์šฐ๋„ ๊ธฐ์ค€๊ฐ’ 8๋ณด๋‹ค ํฌ๊ฑฐ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ•ด ์‹œ์ž‘ ์ธ๋ฑ์Šค๊ฐ€ 8๊นŒ์ง€ ๋„๋‹ฌํ–ˆ๊ณ  ๋์ธ๋ฑ์Šค๋Š” 4๊ฐ€ ๊ธฐ์ค€๊ฐ’ 8๋ณด๋‹ค ์ž‘์œผ๋ฏ€๋กœ 4๋ฅผ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋‹ค. ๋‘ ์œ„์น˜๋ฅผ ๊ตํ™˜ํ•œ๋‹ค.


5 3 (4) [7] {2} 8  ||  9

์‹œ์ž‘ ์ธ๋ฑ์Šค๋Š” ๊ธฐ์ค€๊ฐ’ 4๋ณด๋‹ค ํฐ 7์„ ๋ฐœ๊ฒฌํ–ˆ๊ณ , ๋ ์ธ๋ฑ์Šค๋Š” ๊ธฐ์ค€๊ฐ’ 4๋ณด๋‹ค ์ž‘์€ 2๋ฅผ ๋ฐœ๊ฒฌํ–ˆ๋‹ค. ๋˜ํ•œ ๋‘ ์ธ๋ฑ์Šค๊ฐ€ ๋งŒ๋‚˜๊ธฐ ์ด์ „์ด๋ฏ€๋กœ ๊ตํ™˜์„ ์ˆ˜ํ–‰ํ•œ๋‹ค.


5 3 (4) {2} [7] 8  ||  9

๋‘๋ฒˆ์งธ ๋ฃจํ”„๊ฐ€ ์ง€๋‚œ๋’ค์—๋Š” ์œ„์™€ ๊ฐ™์€ ํ˜•ํƒœ๊ฐ€ ๋˜๊ณ , ์‹œ์ž‘ ์ธ๋ฑ์Šค์˜ ์œ„์น˜์ธ 7์„ ๊ธฐ์ค€์œผ๋กœ ๊ณต๊ฐ„์„ ๋˜ ๋ถ„๋ฆฌํ•œ๋‹ค.


[5] (3) 4 {2}  ||  [(7)] {8}  ||  9

์œ„์™€ ๊ฐ™์€ ๊ฒฝ์šฐ๋„, ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉํ–ˆ๋˜ ๋ฃจํ”„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์ ์šฉํ•˜๋ฉด

์ฒซ๋ฒˆ์งธ ๊ณต๊ฐ„์˜ ๊ฒฝ์šฐ ๊ธฐ์ค€๊ฐ’ 3๋ณด๋‹ค ํฐ 5์™€ ๊ธฐ์ค€๊ฐ’ 3๋ณด๋‹ค ์ž‘์€ 2๋ฅผ ๊ตํ™˜ํ•˜๊ณ  ๋‚˜๋ฉด, ์‹œ์ž‘์ธ๋ฑ์Šค์™€ ๋ ์ธ๋ฑ์Šค๋Š” 3์œผ๋กœ ๋ชจ์ด๊ฒŒ ๋œ๋‹ค.

๋‘๋ฒˆ์งธ ๊ณต๊ฐ„์˜ ๊ฒฝ์šฐ ์—ญ์‹œ, ๊ธฐ์ค€๊ฐ’ 7๋กœ ์‹œ์ž‘์ธ๋ฑ์Šค์™€ ๋ ์ธ๋ฑ์Šค๊ฐ€ ๋ชจ์ด๊ฒŒ ๋œ๋‹ค.


2 {[(3)]} 4 5  ||  {[(7)]} 8  ||  9

์ตœ์ข… ๊ฒฐ๊ณผ๋Š” ์œ„์™€ ๊ฐ™์„ ๊ฒƒ์ด๊ณ , ์ •๋ ฌ์ด ๋˜์–ด์žˆ์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

๋žœ๋คํ•œ ๋ฐฐ์—ด๋กœ, ํ•œ๋ฒˆ ๋‹จ๊ณ„๋ณ„๋กœ ๊ทธ๋ ค๋ณด๋ฉด ์ดํ•ด๊ฐ€ ์‰ฌ์šธ ๊ฒƒ์ด๋‹ค.




์ฝ”๋“œ


static void quickSort(int [] arr){
    quickSort(arr, 0, arr.length-1); //์ดˆ๊ธฐ start ์™€ end ๋Š” 0๊ณผ arr.length-1 ์ด๋ฏ€๋กœ, ๋งŒ๋“  ๋ฉ”์„œ๋“œ, ์‚ฌ์‹ค ์—†์–ด๋„ ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๊ธด ํ•˜๋‹ค.
}

static void quickSort(int [] arr, int start, int end){
    int dividePoint = getDividePoint(arr, start , end);
    if(start<dividePoint-1){ //start๊ฐ€ dividePoint-1 ๋ณด๋‹ค ์ž‘๋‹ค๋Š” ์˜๋ฏธ๋Š”, ์ถฉ๋ถ„ํžˆ ๊ตํ™˜ํ•  ์›์†Œ๊ฐ€ ๋‹ค ์—†์–ด์กŒ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ, ์ •๋ ฌ์ด ๋๋‚œ ์ƒํƒœ
        quickSort(arr,start,dividePoint-1);
    }
    if(end>dividePoint){
        quickSort(arr,dividePoint,end);
    }
}

๋จผ์ € ์‹คํ–‰๋˜๋Š” ๊ตฌ๋ฌธ์€ ์œ„์™€ ๊ฐ™๋‹ค.

pivotPoint ๋Š” ์ดˆ๊ธฐ๊ฐ’์€ ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„ ์ง€์ ์œผ๋กœ ์„ค์ •ํ•  ๊ฒƒ์ด๊ณ , ์ฒซ ๋ฃจํ”„๊ฐ€ ๋๋‚˜๋ฉด, ์ด๋™์ด ๋๋‚œ start index ๋ฅผ pivotPoint ๋กœ ์„ค์ •ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์—

์กฐ๊ฑด๋ฌธ์„ ์œ„์™€ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ๋‹ค.

์ด์ œ getPivotPoint ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผํ•œ๋‹ค.

static int getDividePoint(int [] arr , int start , int end){
    int Pivot = arr[(start+end)/2]; //ํ”ผ๋ฒ—ํฌ์ธํŠธ๋Š” ํ•ญ์ƒ ๊ตฌ๋ถ„๋˜๋Š” ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ
    while(start<=end){ //start ๊ฐ€ end๋ณด๋‹ค ๋’ค์— ์žˆ์„ ๋•Œ๋งŒ ๊ตํ™˜ ์ˆ˜ํ–‰ํ•ด์•ผํ•จ
        while(arr[start]<Pivot){ //pivot์˜ ์•ž์ชฝ์€ ์ž‘์€ ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค ์ฆ๊ฐ€
            start++;
        }
        while(arr[end]>Pivot){
            end--;
        }
        if(start<=end){ //ํ•œ๋ฒˆ ๋” ์ฒดํฌ
            swap(arr,start,end); // ๊ตํ™˜ ํ›„ ์ธ๋ฑ์Šค ์ด๋™์„ ์œ ์ง€์‹œ์ผœ์•ผํ•จ
            start++;
            end--;
        }
    }
    return start; //๋ฃจํ”„๊ฐ€ ๋‹ค ๋๋‚˜๊ณ  ๋‚˜๋ฉด, start๋Š” end์ธ๋ฑ์Šค์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋„˜์–ด๊ฐ„ ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์ด startํฌ์ธํŠธ๋ฅผ divide(๋ถ„๋ฆฌ) ํฌ์ธํŠธ๋กœ ์ œ๊ณต
}

์ด์ œ swap ๋ฉ”์„œ๋“œ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋˜๋Š”๋ฐ, swap ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์€ ๋„ˆ๋ฌด ๊ฐ„๋‹จํ•˜๋‹ˆ ์ƒ๋žตํ•˜๊ฒ ๋‹ค.

์™„์„ฑ ์ฝ”๋“œ


class QuickSort {
    static void quickSort(int [] arr){
        quickSort(arr, 0, arr.length-1); //์ดˆ๊ธฐ start ์™€ end ๋Š” 0๊ณผ arr.length-1 ์ด๋ฏ€๋กœ, ๋งŒ๋“  ๋ฉ”์„œ๋“œ, ์‚ฌ์‹ค ์—†์–ด๋„ ๋˜๋Š” ๋ฉ”์„œ๋“œ์ด๊ธด ํ•˜๋‹ค.
    }

    static void quickSort(int [] arr, int start, int end){
        int dividePoint = getDividePoint(arr, start , end);
        if(start<dividePoint-1){ //start๊ฐ€ dividePoint-1 ๋ณด๋‹ค ์ž‘๋‹ค๋Š” ์˜๋ฏธ๋Š”, ์ถฉ๋ถ„ํžˆ ๊ตํ™˜ํ•  ์›์†Œ๊ฐ€ ๋‹ค ์—†์–ด์กŒ๋‹ค๋Š” ๋œป์ด๋ฏ€๋กœ, ์ •๋ ฌ์ด ๋๋‚œ ์ƒํƒœ
            quickSort(arr,start,dividePoint-1);
        }
        if(end>dividePoint){
            quickSort(arr,dividePoint,end);
        }
    }
    static int getDividePoint(int [] arr , int start , int end){
        int Pivot = arr[(start+end)/2]; //ํ”ผ๋ฒ—ํฌ์ธํŠธ๋Š” ํ•ญ์ƒ ๊ตฌ๋ถ„๋˜๋Š” ๋ฐฐ์—ด์˜ ์ค‘๊ฐ„๊ฐ’์œผ๋กœ
        while(start<=end){ //start ๊ฐ€ end๋ณด๋‹ค ๋’ค์— ์žˆ์„ ๋•Œ๋งŒ ๊ตํ™˜ ์ˆ˜ํ–‰ํ•ด์•ผํ•จ
            while(arr[start]<Pivot){ //pivot์˜ ์•ž์ชฝ์€ ์ž‘์€ ๊ฒฝ์šฐ๋Š” ์ธ๋ฑ์Šค ์ฆ๊ฐ€
                start++;
            }
            while(arr[end]>Pivot){
                end--;
            }
            if(start<=end){ //ํ•œ๋ฒˆ ๋” ์ฒดํฌ
                swap(arr,start,end); // ๊ตํ™˜ ํ›„ ์ธ๋ฑ์Šค ์ด๋™์„ ์œ ์ง€์‹œ์ผœ์•ผํ•จ
                start++;
                end--;
            }
        }
        return start; //๋ฃจํ”„๊ฐ€ ๋‹ค ๋๋‚˜๊ณ  ๋‚˜๋ฉด, start๋Š” end์ธ๋ฑ์Šค์˜ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๋„˜์–ด๊ฐ„ ์ƒํƒœ๊ฐ€ ๋˜๊ณ , ์ด startํฌ์ธํŠธ๋ฅผ divide(๋ถ„๋ฆฌ) ํฌ์ธํŠธ๋กœ ์ œ๊ณต
    }

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


์‹œ๊ฐ„ ์ œํ•œ์ด ๊นŒ๋‹ค๋กœ์šด ์ •๋ ฌ ๋ฌธ์ œ์˜ ๊ฒฝ์šฐ ํ€ต ์ •๋ ฌ์„ ์ ๊ทน ํ™œ์šฉํ•ด๋ด์•ผ๊ฒ ๋‹ค.