[자료구조/알고리즘] - 선택정렬
선택정렬 (selection sort)
가장 작은 요소부터 선택해 알맞은 위치로 옮겨서 순서대로 정렬하는 알고리즘   
가장 작은 요소부터 선택해 알맞은 위치로 옮겨서 순서대로 정렬하는 알고리즘
선택정렬은 다음과 같은 순서로 이루어진다.
- 주어진 리스트에서 최솟값을 찾는다.
 - 그 값을 맨 앞에 위치한 값과 교체한다.
 - 정렬된 요소를 제외한 나머지 리스트를 같은 방법으로 교체한다.(반복)
 
선택정렬 - 예시
    
- 정렬되지 않은 위의 항목들을 이용하여 선택정렬을 한다.
 
   
- 최솟값인 1을 찾고, 첫 번째 위치한 인덱스의 값과 교환한다.
 - 1 -> 3의 위치로, 3 -> 1의 위치로 이동
 
   
- 첫 번째 인덱스에 최솟값이 정해졌다. (정렬마침)
 
   
- 두 번째 위치 ~ 마지막 위치의 최솟값을 찾는다.
 - 최솟값 2를 찾았다. 2는 두 번째 인덱스인 값과 교환한다.
 - 2 -> 3의 위치로, 3 -> 2의 위치로 이동
 
   
- 두 번째 인덱스에 최솟값이 정해졌다. (정렬마침)
 
   
- 세 번째 위치 ~ 마지막 위치의 최솟값을 찾는다.
 - 최솟값 3을 찾았다. 현재 정렬 위치와 최솟값 3의 위치가 동일하므로 그대로 정렬을 마친다.
 
    
- 세 번째 인덱스에 최솟값이 정해졌다. (정렬마침)
 - 마지막 인덱스 정렬이 완료 될 때 까지 앞의 작업들을 계속 반복한다.
 
애니메이션
선택정렬 전체 과정 애니메이션이다.

선택정렬 - Java 코드
public class SelectionSortTest {
    // 자리이동
    static void swap(int[] arr, int idx1, int idx2) {
        int tmp = arr[idx1];
        arr[idx1] = arr[idx2];
        arr[idx2] = tmp;
    }
    // 선택정렬
    static void selectionSort(int[] arr) {
        // 마지막 자리는 자동 정렬 되므로 arr.length - 1
        for (int i = 0; i < arr.length - 1; i++) {
            // 현재 정렬할 인덱스를 최솟값으로 잡고 시작
            int min = i;
            // 정렬 대상 인덱스 다음 순서부터 배열 끝까지 비교하며 최솟값을 찾는다.
            for (int j = i + 1; j < arr.length; j++) {
                if (arr[j] < arr[min]) {
                    min = j;
                }
            }
            // 정렬 대상 인덱스 자리에 이미 최솟값이 있다면 넘어간다.
            if (i != min) {
                swap(arr, i, min);
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = {3, 1, 2, 6, 7 , 5, 4};
        // 선택정렬
        selectionSort(arr);
        // 결과 출력
        System.out.println(Arrays.toString(arr));
    }
}
선택정렬 특징
장점- 구현이 쉽다.
 - 내림차순으로 정렬되어있는 요소를 오름차순으로 재정렬할 때 효율이 좋다.
 - 비교 횟수는 많지만, 실제로 교환하는 횟수는 적다. 교환이 많이 일어나는 자료상태라면 효율적이다.   
- 버블정렬과 비교했을 때, 똑같은 O(n2) 의 시간복잡도를 갖지만,
시간을 측정해보면 버블정렬보다 시간이 짧게 소요됨. 
 - 버블정렬과 비교했을 때, 똑같은 O(n2) 의 시간복잡도를 갖지만,
 
단점- 서로 떨어져 있는 요소를 교환하기 때문에 안정적이지 않다.   
- 중복된 값이 2개 있을 때 요소의 순서가 바뀔 수 있음.
 
 - 이미 정렬된 상태에서 소수의 자료가 추가된 후 재정렬 하면 비효율적이다.
 - 시간복잡도 O(n2) 로 인하여 정렬 시간이 오래 걸림.
 
- 서로 떨어져 있는 요소를 교환하기 때문에 안정적이지 않다.   
 
References
- 선택정렬-위키백과
 - https://gmlwjd9405.github.io/2017/10/01/basic-concepts-of-development-algorithm.html
 - https://yabmoons.tistory.com/250
 - 보요 시바타, 『자료구조와 함께 배우는 알고리즘 입문』, 이지스퍼블리싱(2018)
 - 모든 이미지는 직접 그림
 
Author And Source
이 문제에 관하여([자료구조/알고리즘] - 선택정렬), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://velog.io/@roro/자료구조알고리즘-선택정렬저자 귀속: 원작자 정보가 원작자 URL에 포함되어 있으며 저작권은 원작자 소유입니다.
                                
                                
                                
                                
                                
                                우수한 개발자 콘텐츠 발견에 전념
                                (Collection and Share based on the CC Protocol.)