[Algorithm] 정렬(Sort)-선택정렬(Selection Sort)
정렬(Sort) - selection sort(선택정렬)
selection sort(선택 정렬)
- 가장 간단한 정렬
 - 각 요소를 정렬 된 배열의 적절한 위치에 삽입
 - 빠른 정렬, 병합 정렬 등과 같은 다른 정렬 알고리즘보다 효율성이 떨어짐
 - 가장단순하다는 장점 밖에 없음
 - 최소값을 선택해서 맨 앞에 위치 시킴
 

연산
- 최소인덱스(array[0]) 값을 key으로 선택 (indexMin = i)
 - key 값 제외 배열 내 최소값을 찾기 (j = i+1 ; j < size)
 - key값보다 더 작은 값을 찾을 경우 교체 swap(array[indexMin], array[j])
 - 맨 처음 위치를 뺀 나머지 요소들을 같은 방법으로 반복 (i = 0 ; i < size-1)
 - 배열 내 최소 값이 맨 앞에 위치하게 되면서 오름차순 정렬 됨
 
pseudo code
for i = 0 ; i < size-1
indexMin = i
   for j = i+1 ; j < size
      if arrayindexMin] > array[j]
         swap(array[indexMin], array[j])
      end if
   end for
end for
java로 선택정렬 구현
public void sortFor(int elementData[]){
    int size = elementData.length;
    for (int i = 1 ; i < size ; i++) {
        int key = elementData[i];
        int j;
        //반복문을 중첩 for로 했을 경우
        for (j = i-1; j >= 0 ; j--) {
            //key 보다 큰 값을 만나면
            if ( elementData[j] > key) {
                //해당 위치+1 에 큰 값을 대입 shift
                elementData[j+1] = elementData[j];
            } else {
               //정렬되어있기 때문에 key 보다 작은 값을 만날 경우 바로 반복문 빠져 나옴
               //작은값 위치 j 가지고 있음
                break;
            }
        }
        //key값을 작은값 보다 +1 위치에 넣어줌
        elementData[j+1] = key;
        System.out.println(toString());
    }
}
output
[ * Selection Sort * ]
- before selection sort ----------
[9, 5, 6, 4, 7, 2, 1, 8, 3]
- sorting ----------
[1, 9, 6, 5, 7, 4, 2, 8, 3]
[1, 2, 9, 6, 7, 5, 4, 8, 3]
[1, 2, 3, 9, 7, 6, 5, 8, 4]
[1, 2, 3, 4, 9, 7, 6, 8, 5]
[1, 2, 3, 4, 5, 9, 7, 8, 6]
[1, 2, 3, 4, 5, 6, 9, 8, 7]
[1, 2, 3, 4, 5, 6, 7, 9, 8]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
Complexity
| Complexity | Best Case | Average Case | Worst Case | 
|---|---|---|---|
| Time | Ω(n) | θ(n2) | O(n2) | 
| Space | O(1) | 
references
https://www.javatpoint.com/selection-sort
https://www.geeksforgeeks.org/selection-sort/
https://www.tutorialspoint.com/data_structures_algorithms/sorting_algorithms.htm
https://ko.wikipedia.org/wiki/%EC%84%A0%ED%83%9D_%EC%A0%95%EB%A0%AC