알고리즘/정렬

[정렬] 선택 정렬 Selection Sort

sujo 2020. 7. 22. 16:39

선택 정렬 Selection Sort

 

선택 정렬이란?

최소 혹은 최댓값부터 찾아 정렬하는 방법

다른 정렬들에 비해 비교적 쉽게 구현이 가능하다.

 

(오름차순일 때)

첫 인덱스부터 정렬하는 방법으로 기준으로부터 오른쪽 값들과 비교하여 가장 작은 수를 찾아 값을 교환한다.

 

-핵심코드

1) A와 B의 값을 교환

 tmp = A;
 A = B;
 B = tmp;

 

2) for문의 범위 설정

 for( i=0; i < SIZE -1; i++){

     for( j=i+1 < SIZE; j++){

         ...

     }

 }

바깥 for 문

  • 현재 기준 인덱스를 가리키는 역할
  • 범위는 SIZE-1까지(SIZE-1까지 정렬하면 마지막은 정해지기 때문)

내부 for 문

  • 최소(혹은 최대) 값을 찾는 역할
  • 범위는 기준+1부터 SIZE까지

 

 

정렬 예시

 


선택 정렬 코드(C언어 기반)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define SIZE 10
 
int main() {
    srand(time(NULL));
    int num[SIZE], idx;
 
    //rand으로 1~50 사이의 숫자를 받음
    printf("[ Before ] \n");
    for (int i = 0; i < SIZE; i++) {
        num[i] = rand() % 50 + 1;
        printf("%-2d ", num[i]);
    }
 
    //선택정렬
    //1번째 방법
    for (int i = 0; i < SIZE - 1; i++) {
        idx = i;
        for (int j = i + 1; j < SIZE; j++) {
            if (num[idx] > num[j]) idx = j;
        }
        //if(i != idx){... swap을 줄이고자 한다면
        int tmp = num[i];
        num[i] = num[idx];
        num[idx] = tmp;
    }
 
    //2번째 방법
    /*
    for (int i = 0; i < SIZE-1; i++) {
        for (int j = i + 1; j < SIZE; j++) {
            if (num[i] > num[j]) {
                int tmp = num[i];
                num[i] = num[j];
                num[j] = tmp;
            }
        }
    }
    */
 
    //정렬 후 출력
    printf("\n\n[ After ]\n");
    for (int i = 0; i < SIZE; i++)
        printf("%-2d ", num[i]);
    printf("\n\n");
    return 0;
}
cs

 

[ 출력결과 ]

 

시간 복잡도

 Best O(n²)
 Average O(n²)
 Worst O(n²)

 

 

 

 

'알고리즘 > 정렬' 카테고리의 다른 글

[정렬] 버블 정렬 Bubble Sort  (0) 2020.12.21