[μ •λ ¬] Selection Sort

선택 μ •λ ¬μ˜ κ°œλ…

선택 μ •λ ¬μ΄λž€?

넣을 μœ„μΉ˜λŠ” 이미 μ •ν•΄μ Έ 있고, κ·Έ μœ„μΉ˜μ— μ–΄λ– ν•œ 데이터λ₯Ό 넣을지 μ„ νƒν•˜λŠ” μ•Œκ³ λ¦¬μ¦˜μ΄λ‹€.

λ™μž‘ 방식

1. 리슀트 길이(n)의 -1 만큼 λ°˜λ³΅ν•œλ‹€. (μ•žμ—μ„œλΆ€ν„° μœ„μΉ˜λ₯Ό μ •ν•˜κ²Œ 되면 λ§ˆμ§€λ§‰ 값은 μžλ™μœΌλ‘œ μœ„μΉ˜κ°€ 정해진닀)

    1-2. μ„ νƒλœ μ΅œμ†Ÿκ°’κ³Ό μ΅œμ†Ÿκ°’μ΄ λ“€μ–΄κ°ˆ μœ„μΉ˜μ˜ κ°’κ³Ό κ΅μ²΄ν•œλ‹€.

    1-1. 값이 λ“€μ–΄κ°ˆ μœ„μΉ˜λΆ€ν„° λ§ˆμ§€λ§‰ κ°’κΉŒμ§€ μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ”λ‹€.

    void sort() {
        int min;
        // 1. 값이 λ“€μ–΄κ°ˆ μœ„μΉ˜λ₯Ό μ„ νƒν•˜λŠ” 반볡문
        for(int i=0; i<numbers.length-1; i++) {
            min = i;
            // 1-1. 값이 λ“€μ–΄κ°ˆ μœ„μΉ˜ 뒀에 μžˆλŠ” 데이터듀 쀑에 μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ”λ‹€
            for(int j=i; j<numbers.length; j++) {
                if(numbers[j] < numbers[min]) min = j;
            }
            // 1-2. Swap
            SWAP(i,min);
        }
    }

    void SWAP(int n1, int n2) {
        int temp = numbers[n1];
        numbers[n1] = numbers[n2];
        numbers[n2] = temp;
    }

 

선택 μ •λ ¬μ˜ μž₯단점

μž₯점 

  1. λ°μ΄ν„°μ˜ μˆ˜κ°€ 적을 경우 μ•Œκ³ λ¦¬μ¦˜ μžμ²΄κ°€ 맀우 κ°„λ‹¨ν•˜λ―€λ‘œ λ‹€λ₯Έ λ³΅μž‘ν•œ μ •λ ¬ 방법보닀 μœ λ¦¬ν•  수 μžˆλ‹€.

 

단점

  1. μ–΄λ–€ 상황이든 O(N^2)의 μ‹œκ°„ λ³΅μž‘λ„λ₯Ό κ°–κΈ° λ•Œλ¬Έμ— ν›Œλ₯­ν•œ μ„±λŠ₯을 보여주긴 νž˜λ“¬
  2. stable sort 방법이기 μ•„λ‹ˆκΈ° λ•Œλ¬Έμ—, 두 개의 킀값을 가지고 정렬을 μ‹œλ„ν•  수 μ—†μŒ

μ‹œκ°„ λ³΅μž‘λ„

1. 리슀트 길이(n)의 -1 만큼 λ°˜λ³΅ν•œλ‹€. (값이 λ“€μ–΄κ°ˆ μœ„μΉ˜λŠ” λ§ˆμ§€λ§‰ 값을 μ œμ™Έν•œ n-1개)

    1-1. 값이 λ“€μ–΄κ°ˆ μœ„μΉ˜λΆ€ν„° λ§ˆμ§€λ§‰ κ°’κΉŒμ§€ μ΅œμ†Ÿκ°’μ„ μ°ΎλŠ”λ‹€. → n-1, n-2, n-3 ..... 1

    1-2. μ„ νƒλœ μ΅œμ†Ÿκ°’κ³Ό μ΅œμ†Œκ°’μ΄ λ“€μ–΄κ°ˆ μœ„μΉ˜μ˜ κ°’κ³Ό κ΅μ²΄ν•œλ‹€.

→  1 + 2 + 3 + ...... + n-1 = n(n-1)/2

    O(n^2)이닀.

    μ–΄λ– ν•œ 상황이든 μ΅œμ†Œκ°’μ„ μ°ΎκΈ° μœ„ν•΄ 1-1. λ₯Ό μˆ˜ν–‰ν•˜κΈ° λ•Œλ¬Έμ— μ΅œμ„ , 평균, μ΅œμ•…μ˜ 경우 λͺ¨λ‘ O(n^2)이닀.