Software Courses/Data Structure

Selection sort(선택 정렬)

김 정 환 2020. 12. 22. 21:42
반응형

선택 정렬

    - 앞에서부터 어떤 값을 넣을지 선택하는 알고리즘

 

 

 

동작

    - 주어진 리스트 중에서 최소값/최대값을 선택

    - 선택한 값을 정렬되지 않은 앞의 갑과 교체

    - 위 과정 반복

 

        * 예시

            + 1번 : 탐색하여 최소값 1를 찾고, 첫 번째 값과 교환

            + 2번 : 탐색하여 최소값 2를 찾고, 두 번째 값과 교환

            + 3번 : 탐색하여 최소값 3을 찾고, 세 번째 값과 교환

            + 이하 과정 동일

 

 

 

구현

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
void selectionSort(int *list, int n){
    
    // 최소값 인덱스, 임시 변수  
    int idx_min, tmp;
    
    for(int i=0; i<n-1; i++){
        
        idx_min = i;
        
        // i 이후 부터 값을 비교하면서 
        // 최소값을 찾으면 idx_min의 위치 바꿔주기  
        for(int j=i+1; j<n; j++){
            if(list[j] < list[idx_min])
                idx_min = j
        }
        
        // 최소값의 인덱스와 위치 바꾸기  
        tmp = list[idx_min];
        list[idx_min] = list[i];
        list[i] = tmp;
        
    }
}
cs

 

 

 

비교

    - 버블 정렬 : 버블 정렬보다 평균적으로 빠름

        * 버플 정렬은 인접한 요소들과 항상 swap하지만 선택 정렬은 최소값/최대값과 swap하기 때문

 

    - 삽입 정렬

        * 선택 정렬과 마찬가지로 K번째 요소가 정렬된 순서대로 놓인다는 공통점

        * 선택 정렬은 K+1 요소를 찾기 위해서 나머지 모든 요소를 탐색하지만, 삽입 정렬은 K+1 요소만 탐색하기 때문에 삽입 정렬이 더 빠름

 

 

 

특징

    - 불안정 정렬

        * 안정한 정렬 : [8][4][5][7][8][2]라는 배열이 있을 때, [2][4][5][7][8][8]로 정렬되어 8의 위치가 그대로 유지

        * 불안정한 정렬 : [2][4][5][7][8][8]로 정렬되어 8의 위치가 뒤바뀜

        * 안정한 정렬을 선호하는 이유 : 온라인 쇼핑 목록에서 정렬할 때를 생각해 보자. 첫 번째로 최저가 순으로 나열하고, 두 번째로 리뷰 순으로 나열한다고 하자. 안정한 정렬일 경우에는 최저가에서 리뷰 순으로 나열된다. 불안정한 정렬일 경우에 두 번째인 리뷰 순으로 나열하는 순간 첫 번째로 해놓은 최저가 순 정렬은 무용지물이 된다.

 

    - 시간복잡도 : O(N^2)

 

 

 

참조

    - 위키피디아

    - 블로그 1

    - 블로그 2

반응형

'Software Courses > Data Structure' 카테고리의 다른 글

Shell sort (쉘 정렬)  (0) 2020.12.23
Insertion sort (삽입 정렬)  (0) 2020.12.22
Shortest path (최단 경로)  (0) 2020.12.22
MST(Minimum Spanning Tree) 최소 신장 트리  (0) 2020.12.21
Union-Find  (0) 2020.12.21