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

์ •๋ ฌ - ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort)

interfacer_han 2023. 11. 29. 11:30

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

#1-1

 

#1-2

 

#2 ์ฝ”๋“œ

#2-1 ์ž๋ฐ”

public static void insertionSort(int[] array, int startIndex, int endIndex) {
    for(int maxIndex = (startIndex + 1); maxIndex <= endIndex; maxIndex++) {
        // array[maxIndex]๊ฐ€ ์ตœ๋Œ“๊ฐ’์ธ ๊ฒฝ์šฐ
        if(array[maxIndex - 1] <= array[maxIndex]) {
            continue;
        
        // array[maxIndex]๊ฐ€ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ
        } else {
            insertion(array, startIndex, maxIndex);
        }
        
        
    }
}

private static void insertion(int[] array, int startIndex, int insertIndex) {
    
    // ์‚ฝ์ž… ์œ„์น˜ ์ฐพ๊ธฐ
    int insertionDestination = -1;
    for(int i = startIndex; i < insertIndex; i++) {
        
        /*
            * if(array[i] <= array[insertIndex]) { insertionDestination = i + 1 } ๋ผ๊ณ  ์“ฐ๋ฉด ์•ˆ ๋œ๋‹ค.
            * ์™œ๋ƒํ•˜๋ฉด,
            * array[insertIndex]๊ฐ€ array์˜ ์ตœ์†Ÿ๊ฐ’์ธ ๊ฒฝ์šฐ, ์‚ฝ์ž… ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (insertionDestination์˜ ๊ฐ’์ด -1์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ)
            * ๊ทธ๋ ‡๋‹ค๋ฉด,
            * if(array[insertIndex] <= array[i]) { insertionDestination = i } ๋ผ๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ '์™œ' ๋˜๋Š”๊ฐ€?
            * array[insertIndex]๋Š” '๋ฐ˜๋“œ์‹œ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹ˆ๋‹ค' (insertSort() ์ฐธ์กฐ)
            * ๋”ฐ๋ผ์„œ, ์ด ๊ฒฝ์šฐ insertionDestination์˜ ๊ฐ’์—” ๋ฐ˜๋“œ์‹œ -1์„ ์ดˆ๊ณผํ•œ ๊ฐ’(๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค)์ด ํ• ๋‹น๋œ๋‹ค.
            */
        if(array[insertIndex] <= array[i]) {
            insertionDestination = i;
            break;
        }
    }
    
    // ์‚ฝ์ž… ์œ„์น˜์— ๋”ฐ๋ฅธ array์˜ ์ธ๋ฑ์Šค ์กฐ์ •
    int temp = array[insertIndex];
    for(int i = (insertIndex - 1); i >= insertionDestination; i--) {
        array[i + 1] = array[i];
    }
    array[insertionDestination] = temp;
}

 

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

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

    for(maxIndex : Int in (startIndex + 1)..endIndex) {
        // array[maxIndex]๊ฐ€ ์ตœ๋Œ“๊ฐ’์ธ ๊ฒฝ์šฐ
        if(array[maxIndex - 1] <= array[maxIndex]) {
            continue

        // array[maxIndex]๊ฐ€ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹Œ ๊ฒฝ์šฐ
        } else {
            insertion(array, startIndex, maxIndex)
        }
    }
}

fun insertion(array: Array<Int>, startIndex : Int, insertIndex: Int) {

    // ์‚ฝ์ž… ์œ„์น˜ ์ฐพ๊ธฐ
    var insertionDestination = -1
    for(i : Int in startIndex..<insertIndex) {

        /*
         * if(array[i] <= array[insertIndex]) { insertionDestination = i + 1 } ๋ผ๊ณ  ์“ฐ๋ฉด ์•ˆ ๋œ๋‹ค.
         * ์™œ๋ƒํ•˜๋ฉด,
         * array[insertIndex]๊ฐ€ array์˜ ์ตœ์†Ÿ๊ฐ’์ธ ๊ฒฝ์šฐ, ์‚ฝ์ž… ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (insertionDestination์˜ ๊ฐ’์ด -1์—์„œ ๋ณ€๊ฒฝ๋˜์ง€ ์•Š์Œ)
         * ๊ทธ๋ ‡๋‹ค๋ฉด,
         * if(array[insertIndex] <= array[i]) { insertionDestination = i } ๋ผ๊ณ  ์“ฐ๋Š” ๊ฒƒ์€ '์™œ' ๋˜๋Š”๊ฐ€?
         * array[insertIndex]๋Š” '๋ฐ˜๋“œ์‹œ ์ตœ๋Œ“๊ฐ’์ด ์•„๋‹ˆ๋‹ค' (insertSort() ์ฐธ์กฐ)
         * ๋”ฐ๋ผ์„œ, ์ด ๊ฒฝ์šฐ insertionDestination์˜ ๊ฐ’์—” ๋ฐ˜๋“œ์‹œ -1์„ ์ดˆ๊ณผํ•œ ๊ฐ’(๋ฐฐ์—ด์˜ ์ธ๋ฑ์Šค)์ด ํ• ๋‹น๋œ๋‹ค.
         */
        if(array[insertIndex] <= array[i]) {
            insertionDestination = i
            break
        }
    }

    // ์‚ฝ์ž… ์œ„์น˜์— ๋”ฐ๋ฅธ array์˜ ์ธ๋ฑ์Šค ์กฐ์ •
    val temp = array[insertIndex]
    for(i : Int in (insertIndex - 1) downTo insertionDestination) {
        array[i + 1] = array[i]
    }
    array[insertionDestination] = temp
}

 

#3 ์š”์•ฝ

์‚ฝ์ž… ์ •๋ ฌ์€ ์ •๋ ฌ๋œ ๋ฐฐ์—ด์— ๊ฐ’์„ '์‚ฝ์ž…'ํ•˜๊ณ , ๊ทธ ๋’ค์˜ ์›์†Œ๋“ค์„ ๋ฐ€์–ด๋‚ด๋Š” ์ •๋ ฌ์ด๋‹ค.

 

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

 

[๋ฐฑ์ค€] 27522 - ์นดํŠธ๋ผ์ด๋”: ๋“œ๋ฆฌํ”„ํŠธ

#1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‚ฝ์ž… ์ •๋ ฌ (Insertion Sort) #1 ์•Œ๊ณ ๋ฆฌ์ฆ˜ #2 ์ฝ”๋“œ (์ž๋ฐ”) public static void insertionSort(int[] array, int startIndex, int endIndex) { for(int maxIndex = (startIndex + 1); maxIndex kenel.tistory.com ์ •๋ ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์—ฌ๋Ÿฌ

kenel.tistory.com