선택정렬(Selection Sort)
개념
Selection Sort는 해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 어떤 원소를 넣을지 선택하는 알고리즘입니다.
로직
최소값을 찾아 왼쪽으로 이동시키는데 데이터의 크기만큼 반복하여 정렬하는 방법
- 주어진 배열에서 최소값을 찾습니다.
- 그 값을 맨앞에 위치한 값과 교채합니다.
- 맨처음 위치를 뺀 나머지 배열에 1~2의 과정을 반복합니다.
코드
SelectionSort.java
package Algorithm;
import java.util.Arrays;
import java.util.Random;
public class SelectionSort {
static final int N = 10;
public static void main(String[] args) {
Random random = new Random(); // 랜덤함수를 이용
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = random.nextInt(100); // 0 ~ 99
}
System.out.println("정렬 전: " + Arrays.toString(arr));
selectionSort(arr);
System.out.println("정렬 후: " + Arrays.toString(arr));
}
private static void selectionSort(int[] arr) {
int index;
for (int i = 0; i < arr.length; i++) {
index = i;
for (int j = i + 1; j < arr.length; j++) {
if (arr[index] > arr[j]) {
index = j;
}
}
swap(arr, index, i);
}
}
private static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
console
정렬 전: [56, 11, 41, 96, 29, 9, 19, 13, 39, 28]
정렬 후: [9, 11, 13, 19, 28, 29, 39, 41, 56, 96]
시간복잡도
주어진 데이터의 개수가 $n$개 일때
$$
\sum_{i=1}^{n-1}n-i=(n-1)+(n-2)+(n-3)+...+1=\frac{n(n-1)}{2}
$$
번의 비교를 하게 된다.
최선, 최악, 평균 모두 $O(N^2)$의 동일한 시간복잡도를 갖습니다.
장점
- 알고리즘이 단순하여 구현이 쉽다.
- Bubble Sort와 실제로 비교하는 횟수는 같지만 교환하는 횟수가 작기때문에 Bubble Sort에 비해 비교적 효율적입니다.
- 추가적인 메모리 공간이 필요하지 않다.
단점
- 시간복잡도가 $O(N^2)$으로 비효율적이다.
- 불완전 정렬이다.
'Algorithm' 카테고리의 다른 글
병합정렬(Merge sort) (0) | 2020.07.19 |
---|---|
퀵정렬(Quick Sort) (0) | 2020.07.19 |
삽입정렬(Insertion Sort) (0) | 2020.07.19 |
거품정렬(Bubble Sort) (0) | 2020.07.19 |
[Algorithm] 최소신장트리(MST) (0) | 2019.11.10 |