알고리즘/Sort(정렬)

정렬(2) 선택정렬

akongman 2024. 2. 29. 20:13

선택 정렬이라는 것은 순회를 돌며 가장 작은 수를 구하고 그 작은 수와 바꿀 요소값과 비교. 하는 형태이다.

3 5 2 4 1

 

위와 같은 숫자가 있다면

3 5 2 4 1

 

3부터 1까지 즉, [0] ~ [4] 까지 배열 번지에 접근을 하고 그 요소값들을 비교하며 가장 작은 수를 뽑아 

[ 0 ] 에 있는 값과 바꾸겠다라는 뜻이다. 

즉, 1이 가장 작은 최소값이기에  3과 1의 위치는 바뀌게 될 것이다.

1 5 2 4 3

 

위와 같이 말이다.

 

그러고 다음 또 순회를 돌며 다음 최소값을 구한다. 다음 최소값은 2다 그럼 [ 1 ] 요소값과 바꾼다

즉, 5와 2의 위치를 바꾼다.

1 2 5 4 3

 

다음과 같이 말이다.

이런식으로 반복을 하면 최종적으로 다음과 같이 정렬된 결과를 볼 수 있다.

1 2 3 4 5

 

그럼 위 선택정렬 알고리즘의 원리를 이용하여 정렬을 해보자.

 

이번에도 어떻게 하면 선택정렬의 원리를 이용하여 정렬된 결과를 추출해줄 수 있을지 고민해보자.

 

자~ 고민했다고 가정하에 소스 코드를 보이겠다.

 

#include <iostream>

int main() { 
    int array [] {3,5,2,4,1};
    int temp; int small; 
    
    for (int i=0; i<4; i++) {
        small = i;
        for (int j=i; j<4; j++) { 
            if (array[small]>array[j+1]) { 
                small = j+1;
            }
        }
        temp = array[i];
        array[i] = array[small];
        array[small] = temp;
    }
    
    
    for (int i=0; i<5; i++) { std::cout<<array[i]<<' '; }
    
}

 

 

위와 같은 방법도 있고

 

다음과 같은 방법도 있다

 for (int i=0; i<4; i++) { 
         int small = i; //핵심1
         for (int j=i+1; j<=4; j++) { 
             if (array[small]>array[j]) { 
                 small = j; // 핵심2 이야.
             }
        }
         temp = array[i];
         array[i] = array[small];
         array[small] = temp;    
}