선택 μ •λ ¬μ΄λž€ λ¬΄μ—‡μΌκΉŒ?

선택 μ •λ ¬μ΄λž€ 정렬이 λ˜μ§€ μ•Šμ€ 전체 데이터 μ€‘μ—μ„œ ν•΄λ‹Ή μœ„μΉ˜μ— λ§žλŠ” 데이터λ₯Ό μ„ νƒν•˜μ—¬ μœ„μΉ˜λ₯Ό κ΅ν™˜ν•˜λŠ” 제자리 μ •λ ¬ μ•Œκ³ λ¦¬μ¦˜μž…λ‹ˆλ‹€. μ•„λž˜μ™€ 같은 절차둜 μ§„ν–‰λ©λ‹ˆλ‹€.

  • 1) μ£Όμ–΄μ§„ 데이터 리슀트 μ€‘μ—μ„œ 제일 μž‘μ€ 값을 κ°–λŠ” 데이터λ₯Ό μ°ΎλŠ”λ‹€.
  • 2) 찾은 데이터λ₯Ό κ°€μž₯ μ²˜μŒμ— μœ„μΉ˜ν•œ λ°μ΄ν„°μ˜ μœ„μΉ˜μ™€ κ΅μ²΄ν•œλ‹€.
  • 3) κ°€μž₯ 처음 μœ„μΉ˜λ₯Ό μ œμ™Έν•œ λ‚˜λ¨Έμ§€ 데이터도 같은 λ°©λ²•μœΌλ‘œ κ΅μ²΄ν•œλ‹€.

이λ₯Ό μ˜μ‚¬ μ½”λ“œ(Pseudo Code)둜 λ‚˜νƒ€λ‚΄λ©΄ μ•„λž˜μ™€ κ°™μŠ΅λ‹ˆλ‹€.

For i -> 0 to n:
    a[i] to a[n-1] κΉŒμ§€ λΉ„κ΅ν•œ 데이터 쀑 κ°€μž₯ μž‘μ€ 데이터가 a[j]에 μžˆλ‹€λ©΄,
    a[i] and a[j] swapping 


선택 μ •λ ¬ μ§„ν–‰

그림으둜 선택 μ •λ ¬μ˜ μ§„ν–‰ 과정을 μžμ„Ένžˆ μ‚΄νŽ΄λ΄…μ‹œλ‹€. μ‹œμž‘ μƒνƒœμ— λŒ€ν•œ 포함 μ—¬λΆ€(초기 μƒνƒœλ‘œ μ£ΌλŠλƒ μ•ˆ μ£ΌλŠλƒ)에 λ”°λΌμ„œ νšŒμ „ 횟수(PASS)λ₯Ό μ„ΈλŠ” 방식이 λ‹€λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

"μ—¬κΈ°μ„œλŠ” μœ„μΉ˜λ₯Ό λ³€κ²½ν•˜λŠ” 경우만 N νšŒμ „(PASS)둜 κ³„μ‚°ν•©λ‹ˆλ‹€."

선택 μ •λ ¬ Step1


선택 μ •λ ¬ Step2


선택 μ •λ ¬ Step3


선택 μ •λ ¬ Step4


선택 μ •λ ¬ Step5


선택 μ •λ ¬ Step6


선택 μ •λ ¬ Step7


선택 μ •λ ¬ Step8


선택 μ •λ ¬ Step9


선택 μ •λ ¬ Step10



선택 μ •λ ¬ κ΅¬ν˜„

μœ„ 과정을 μ†ŒμŠ€ μ½”λ“œλ₯Ό 톡해 μ‚΄νŽ΄λ΄…μ‹œλ‹€.

void selectionSort(int *list, const int n)
{
    int i, j, indexMin, temp;

    for (i = 0; i < n - 1; i++)
    {
        indexMin = i;
        for (j = i + 1; j < n; j++)
        {
            if (list[j] < list[indexMin])
            {
                indexMin = j;
            }
        }
        temp = list[indexMin];
        list[indexMin] = list[i];
        list[i] = temp;
    }
}


선택 μ •λ ¬μ˜ μ„±λŠ₯

λ³΅μž‘λ„λ₯Ό μ‚΄νŽ΄λ³ΌκΉŒμš”? μ΅œμ„ (min), 평균(ave), μ΅œμ•…(max)의 경우일 λ•Œ 정렬을 μœ„ν•œ 비ꡐ 횟수λ₯Ό C라고 ν•˜λ©΄ μ•„λž˜μ™€ 같이 λ‚˜νƒ€λ‚Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

\[{ C }_{ min }{ =C }_{ ave }={ C }_{ max }=\sum _{ i=1 }^{ N-1 }{ N-i } =\frac { N(N-1) }{ 2 } =O({ n }^{ 2 })\]

μ—¬κΈ°μ„œ N은 λ°μ΄ν„°μ˜ 개수λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.