๊นจ์•Œ ๊ฐœ๋… ๐Ÿ“‘/์•Œ๊ณ ๋ฆฌ์ฆ˜

์ •๋ ฌ - ํ€ต ์ •๋ ฌ (Quick Sort)

interfacer_han 2023. 12. 1. 12:46

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜

#1-1

์–ด๋–ค ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก์„ ๊ฒƒ์ด๋ƒ๋Š” ์•„๋ฌด๋ž˜๋„ ์ƒ๊ด€์—†๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ ๋ฐฐ์—ด์˜ ๋งจ ๋ ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๊ธฐ๋กœ ํ•œ๋‹ค.โ€จโ€จํ˜น์‹œ๋ผ๋„ ๊ธฐ์ค€์„ ๋Œ€๋žต์ ์œผ๋กœ๋ผ๋„ ์›์†Œ๋“ค์˜ ํ‰๊ท ๊ฐ’์— ๊ฐ€๊น๊ฒŒ ์žก์„ ์ˆ˜ ์žˆ๋Š” ์กฐ๊ฑด์ด ์กด์žฌํ•œ๋‹ค๋ฉด, ํ•ด๋‹น ์กฐ๊ฑด์„ ์ด์šฉํ•ด ๊ธฐ์ค€์„ ์žก๊ฒŒ๋” ์‘์šฉํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฒƒ์ด๋‹ค. ๊ธฐ์ค€์ด ํ‰๊ท ๊ฐ’์— ๊ฐ€๊น๊ฒŒ ์žกํž์ˆ˜๋ก, ํ€ต ์ •๋ ฌ์˜ ์„ฑ๋Šฅ์ด ์ข‹์•„์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค.

 

#1-2

์ด '๋ถ„ํ• (partition)'์˜ ๊ฒฐ๊ณผ๋กœ ๊ธฐ์ค€ ์›์†Œ์˜ ์ž๋ฆฌ๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ์ •๋˜๋ฉด, ๊ทธ ์›์†Œ๋Š” ์•ž์œผ๋กœ์˜ ๋ชจ๋“  qucikSort() ์žฌ๊ท€ ํ˜ธ์ถœ์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ณ  ์˜์›ํžˆ ๊ทธ ์ž๋ฆฌ๊ฐ€ ๊ณ ์ •๋œ๋‹ค. ์ฆ‰, ๋ถ„ํ•  ํ•œ ๋ฒˆ์— ์›์†Œ ํ•˜๋‚˜๊ฐ€ ์ •๋ ฌ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

 

#1-3

 

ํ€ต ์ •๋ ฌ - ์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „

์œ„ํ‚ค๋ฐฑ๊ณผ, ์šฐ๋ฆฌ ๋ชจ๋‘์˜ ๋ฐฑ๊ณผ์‚ฌ์ „. ํ€ต ์ •๋ ฌ(Quicksort)์€ ์ฐฐ์Šค ์•คํ„ฐ๋‹ˆ ๋ฆฌ์ฒ˜๋“œ ํ˜ธ์–ด๊ฐ€ ๊ฐœ๋ฐœํ•œ ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค. ๋‹ค๋ฅธ ์›์†Œ์™€์˜ ๋น„๊ต๋งŒ์œผ๋กœ ์ •๋ ฌ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋น„๊ต ์ •๋ ฌ์— ์†ํ•œ๋‹ค. ํ€ต ์ •๋ ฌ์€ n๊ฐœ์˜ ๋ฐ

ko.wikipedia.org

ํ€ต ์ •๋ ฌ์˜ ์ด ๋น„๊ต ํšŸ์ˆ˜ ๊ณ„์‚ฐ์€ ํ•ด๋‹น ๋งํฌ๋กœ ๋Œ€์ฒดํ•œ๋‹ค.

 

#2 ์ฝ”๋“œ

#2-1 ์ž๋ฐ”

public static void quickSort(int[] array, int startIndex, int endIndex) {
    // (startIndex < endIndex)์˜ ์˜๋ฏธ: ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2์ด์ƒ์ด๋‹ค.
    if(startIndex < endIndex) {
        int pivotIndex = partitionAroundPivot(array, startIndex, endIndex);
        quickSort(array, startIndex, (pivotIndex - 1));
        quickSort(array, pivotIndex, endIndex);
    }
    
}

// endIndex๊ฐ€ pivot(๊ธฐ์ค€)์˜ ์—ญํ•  ์ˆ˜ํ–‰
private static int partitionAroundPivot(int[] array, int startIndex, int endIndex) {
    int endOfLower = startIndex - 1;
    
    for(int i = startIndex; i < endIndex; i++) {
        if(array[i] <= array[endIndex]) {
            // array[endIndex]๋ณด๋‹ค lower์ธ ๊ฐ’ ์ €์žฅํ•  ๊ณต๊ฐ„ ํ™•๋ณด๋ฅผ ์œ„ํ•ด endOfLower++
            endOfLower++;
            
            // array[i]์™€ array[endOfLower]์˜ ๊ฐ’ ์„œ๋กœ ๊ตํ™˜
            int temp = array[endOfLower];
            array[endOfLower] = array[i];
            array[i] = temp;
        }
    }
    
    // array[endOfLower] ๋ฐ”๋กœ ๋’ค์— array[endIndex] (= ๊ธฐ์ค€) ๊ฐ’์ด ์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ endOfLower++
    endOfLower++;
    
    // array[endIndex]๊ณผ array[endOfLower]์˜ ๊ฐ’ ์„œ๋กœ ๊ตํ™˜
    int temp = array[endOfLower];
    array[endOfLower] = array[endIndex];
    array[endIndex] = temp;
    
    return endOfLower;
}

 

#2-2 ์ฝ”ํ‹€๋ฆฐ

fun quickSort(array: Array<Int>, startIndex : Int, endIndex : Int) {

    // (startIndex < endIndex)์˜ ์˜๋ฏธ: ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2์ด์ƒ์ด๋‹ค.
    if(startIndex < endIndex) {
        val pivotIndex = partitionAroundPivot(array, startIndex, endIndex)
        quickSort(array, startIndex, (pivotIndex - 1))
        quickSort(array, pivotIndex, endIndex)
    }
}

// endIndex๊ฐ€ pivot(๊ธฐ์ค€)์˜ ์—ญํ•  ์ˆ˜ํ–‰
fun partitionAroundPivot(array: Array<Int>, startIndex : Int, endIndex: Int) : Int {
    var endOfLower = startIndex - 1

    for (i: Int in startIndex..<endIndex) {
        if (array[i] <= array[endIndex]) {
            // array[endIndex]๋ณด๋‹ค lower์ธ ๊ฐ’ ์ €์žฅํ•  ๊ณต๊ฐ„ ํ™•๋ณด๋ฅผ ์œ„ํ•ด endOfLower++
            endOfLower++

            // array[i]์™€ array[endOfLower]์˜ ๊ฐ’ ์„œ๋กœ ๊ตํ™˜
            val temp = array[endOfLower]
            array[endOfLower] = array[i]
            array[i] = temp
        }
    }

    // array[endOfLower] ๋ฐ”๋กœ ๋’ค์— array[endIndex] (= ๊ธฐ์ค€) ๊ฐ’์ด ์˜ค๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ endOfLower++
    endOfLower++

    // array[endIndex]๊ณผ array[endOfLower]์˜ ๊ฐ’ ์„œ๋กœ ๊ตํ™˜
    val temp = array[endOfLower]
    array[endOfLower] = array[endIndex]
    array[endIndex] = temp

    return endOfLower
}

 

#3 ์š”์•ฝ

ํ€ต ์ •๋ ฌ์€ ํ•œ๋ฒˆ ์ˆ˜ํ–‰๋  ๋•Œ๋งˆ๋‹ค ๊ธฐ์ค€ ์›์†Œ ํ•˜๋‚˜๋ฅผ ์ •๋ ฌํ•œ๋‹ค.

 

#4 ์ด ๊ฐœ๋…์ด ์‚ฌ์šฉ๋œ ๊ธ€

 

28417 - ์Šค์ผ€์ดํŠธ๋ณด๋“œ

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ€ต ์ •๋ ฌ (Quick Sort) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์–ด๋–ค ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก์„ ๊ฒƒ์ด๋ƒ๋Š” ์•„๋ฌด๋ž˜๋„ ์ƒ๊ด€์—†๋‹ค. ์—ฌ๊ธฐ์—์„œ๋Š” ๊ฐ ๋ฐฐ์—ด์˜ ๋งจ ๋ ์›์†Œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ์žก๊ธฐ๋กœ ํ•œ๋‹ค. ํ˜น์‹œ๋ผ๋„ ๊ธฐ์ค€์„ ๋Œ€๋žต์ ์œผ๋กœ๋ผ๋„

kenel.tistory.com