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

์ •๋ ฌ - ๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort)

interfacer_han 2023. 11. 14. 13:48

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

#1-1

 

#1-2

 

#1-3

 

#1-4

 

#1-5

๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์ด ๋น„๊ต ํšŸ์ˆ˜๋Š”, ์ตœ์•…์˜ ๊ฒฝ์šฐ nlog2n์ด๋‹ค

 

#2 ์ฝ”๋“œ

#2-1 ์ž๋ฐ”

public static void mergeSort(int[] array, int startIndex, int endIndex) {

    // (startIndex < endIndex)์˜ ์˜๋ฏธ: ๋ฐฐ์—ด์˜ ํฌ๊ธฐ๊ฐ€ 2์ด์ƒ์ด๋‹ค.
    if(startIndex < endIndex) {
        int midIndex = (startIndex + endIndex) / 2;
        mergeSort(array, startIndex, midIndex);
        mergeSort(array, (midIndex + 1), endIndex);
        
        merge(array, startIndex, midIndex, endIndex);
    }
}

private static void merge(int[] array, int startIndex, int midIndex, int endIndex) {
    // array์—์„œ ๋‚˜๋‰œ 'f'irst ๋ถ€๋ถ„์„ ์ˆœํšŒํ•  ์ธ๋ฑ์Šค f
    int f = startIndex; // f์˜ ์ตœ๋Œ“๊ฐ’์€ midIndex
    
    // array์—์„œ ๋‚˜๋‰œ 's'econd ๋ถ€๋ถ„์„ ์ˆœํšŒํ•  ์ธ๋ฑ์Šค s
    int s = midIndex + 1; // s์˜ ์ตœ๋Œ“๊ฐ’์€ endIndex
    
    // 'T'emporary ๋ฐฐ์—ด ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•  ์ธ๋ฑ์Šค t
    int[] T = new int[endIndex - startIndex + 1];
    int t = 0;
    
    while(f <= midIndex && s <= endIndex) {
        
        if(array[f] < array[s]) {
            T[t++] = array[f++];
            
        } else {
            T[t++] = array[s++];
            
        }
    }
    
    // f์˜ ์˜์—ญ์ด ๋‚จ์•˜๋‹ค๋ฉด ๋น„์›Œ์ค€๋‹ค
    while(f <= midIndex) {
        T[t++] = array[f++];
    }
    
    // s์˜ ์˜์—ญ์ด ๋‚จ์•˜๋‹ค๋ฉด ๋น„์›Œ์ค€๋‹ค
    while(s <= endIndex) {
        T[t++] = array[s++];
    }
    
    for(int i = 0; i < T.length; i++) {
        array[startIndex + i] = T[i];
    }
}

 

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

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

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

        merge(array, startIndex, midIndex, endIndex)
    }
}

fun merge(array : Array<Int>, startIndex: Int, midIndex : Int, endIndex: Int) {
    // array์—์„œ ๋‚˜๋‰œ 'f'irst ๋ถ€๋ถ„์„ ์ˆœํšŒํ•  ์ธ๋ฑ์Šค f
    var f = startIndex // f์˜ ์ตœ๋Œ“๊ฐ’์€ midIndex

    // array์—์„œ ๋‚˜๋‰œ 's'econd ๋ถ€๋ถ„์„ ์ˆœํšŒํ•  ์ธ๋ฑ์Šค s
    var s = midIndex + 1 // s์˜ ์ตœ๋Œ“๊ฐ’์€ endIndex

    // 'T'emporary ๋ฐฐ์—ด ๊ทธ๋ฆฌ๊ณ  ์ด ๋ฐฐ์—ด์„ ์ˆœํšŒํ•  ์ธ๋ฑ์Šค t
    val T : Array<Int> = Array(endIndex - startIndex + 1) { 0 }
    var t = 0

    while(f <= midIndex && s <= endIndex) {

        if(array[f] < array[s]) {
            T[t++] = array[f++]

        } else {
            T[t++] = array[s++]
        }
    }

    // f์˜ ์˜์—ญ์ด ๋‚จ์•˜๋‹ค๋ฉด ๋น„์›Œ์ค€๋‹ค
    while(f <= midIndex) {
        T[t++] = array[f++]
    }

    // s์˜ ์˜์—ญ์ด ๋‚จ์•˜๋‹ค๋ฉด ๋น„์›Œ์ค€๋‹ค
    while(s <= endIndex) {
        T[t++] = array[s++]
    }

    for(i : Int in 0..(T.size - 1)) {
        array[startIndex + i] = T[i]
    }
}

 

#3 ์š”์•ฝ

๋ณ‘ํ•ฉ ์ •๋ ฌ์€ ๋ฌธ์ œ๋ฅผ 2๊ฐœ๋กœ ๋‚˜๋ˆˆ ํ›„โ€จ'๋ณ‘ํ•ฉ'ํ•˜๋Š” ์ •๋ ฌ์ด๋‹ค

 

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

 

2751

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์ด ๋น„๊ต ํšŸ์ˆ˜๋Š”, ์ตœ์•…์˜ ๊ฒฝ์šฐ nlog2n์ด๋‹ค #2 ์ฝ”๋“œ (์ž๋ฐ”) public static void mergeSort(int[] array, int startIndex, int endIndex) { // (startIndex < endIndex)์˜ ์˜

kenel.tistory.com

 

11651 - ์ขŒํ‘œ ์ •๋ ฌํ•˜๊ธฐ 2

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ 11650 - ์ขŒํ‘œ ์ •๋ ฌํ•˜๊ธฐ #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํž™ ์ •๋ ฌ (Heap Sort) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํž™(heap)์ด๋ผ๋Š” ์˜์–ด ๋‹จ์–ด์˜ ์‚ฌ์ „์  ์˜๋ฏธ๋Š” ์Œ“์•„ ๋†“์€ ๋ฌด๋”๊ธฐ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ๋‹จ์–ด๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ๋„ ์‚ฌ์šฉ๋œ๋‹ค. ์ฒซ์งธ๋กœ

kenel.tistory.com

 

[๋ฐฑ์ค€] 11399 - ATM

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ‘ํ•ฉ ์ •๋ ฌ (Merge Sort) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ณ‘ํ•ฉ ์ •๋ ฌ์˜ ์ด ๋น„๊ต ํšŸ์ˆ˜๋Š”, ์ตœ์•…์˜ ๊ฒฝ์šฐ nlog2n์ด๋‹ค #2 ์ฝ”๋“œ (์ž๋ฐ”) public static void mergeSort(int[] array, int startIndex, int endIndex) { // (startIndex < endIndex)์˜ ์˜

kenel.tistory.com