[Algorithm] 선택 정렬(Selection Sort)Study/CS2024. 4. 9. 02:08
Table of Contents
선택 정렬
선택 정렬(Selection Sort)는 버블 정렬(Bubble Sort)와 유사한 알고리즘으로,
해당 순서에 원소를 넣을 위치는 이미 정해져 있고, 어떤 원소를 넣을지 선택하는 알고리즘입니다.
선택 정렬과 삽입 정렬(Insertio Sort)과 헷갈려할 수 있는데,
선택 정렬은 배열에서 해당 자리를 선택하고 그 자리에 오는 값을 찾는 것이라고 생각하면 편하다.
Process (Ascending)
1. 주어진 배열 중에 최소값을 찾는다.
2. 그 값을 맨 앞에 위치한 값과 교체한다. (Pass)
3. 맨 처음 위치를 뺀 나머지 배열을 같은 방법으로 교체한다.
Java Code (Ascending)
void selectionSort(int[] arr){
int indexMin, temp;
for(int i = 0; i < arr.length-1; i++) { // 1
indexMin = i;
for(int j = i + 1; j < arr.length; j++){ //2
if(arr[j] < arr[indexMin]){ // 3
indexMin = j;
}
}
// 4. swap(arr[indexMin], arr[i])
temp = arr[indexMin];
arr[indexMin] = arr[i];
arr[i] = temp;
}
System.out.println(Arrays.toString(arr));
}
1. 우선 위치(index)를 선택해준다.
2. i + 1번째 원소부터 선택한 위치(index)의 값과 비교를 시작한다.
3. 오름차순이므로 현재 선택한 자리에 있는 값보다 순회하고 있는 값이 작다면, 위치(index)를 갱신해준다.
4. '2'번 반복문이 끝난 뒤에는 indexMin에
'1'번에서 선택한 위치(index)에 들어가야 하는 값의 위치(index)를 갖고 있으므로
서로 교환(swap)해준다.
시간복잡도
데이터의 개수가 n개라고 했을 때,
- 첫 번째 회전에서의 비교횟수 : 1 ~ (n-1) => n-1
- 두 번째 회전에서의 비교횟수 : 2 ~ (n-1) => n-2
- ...
- (n-1) + (n-2) + ... + 2 + 1 => n(n-1)/2
비교하는 것이 상수 시간에 이루어진다는 가정 아래, n개의 주어진 배열을 정렬하는데 O(n^2) 만큼의 시간이 걸린다.
최선, 평균, 최악의 경우 시간복잡도는 O(n^2) 으로 동일하다.
공간복잡도
주어진 배열 안에서 교환(swap)을 통해, 정렬이 수행되므로 O(n) 입니다.
장점
- 버블 정렬 (Bubble Sort)과 마찬가지로 알고리즘이 단순하다.
- 정렬을 위한 비교 횟수는 많지만, 버블 정렬에 비해 실제로 교환하는 횟수는 적기 때문에 많은 교환이 일어나야 하는 자료 상태에서 비교적 효율적이다.
- 버블 정렬과 마찬가지로 정렬하고자 하는 배열 안에서 교환하는 방식이기 때문에 다른 메모리 공간을 필요로 하지 않는다. -> 제자리 정렬
단점
- 시간복잡도가 O(n^2) 으로, 비효율적이다.
- 불안정 정렬(Unstable Sort)이다.
Reference
'Study > CS' 카테고리의 다른 글
[자료구조] Array, Array List, Linked List (0) | 2024.11.04 |
---|---|
[JAVA] Garbage Collection (0) | 2024.11.03 |
[Algorithm] 거품 정렬 (Bubble Sort) (0) | 2024.04.04 |
[Design Pattern] 어댑터 패턴 (0) | 2024.04.02 |
[WEB] 브라우저 동작 방법 (0) | 2024.03.28 |
@chumminggg :: Log_Double 7