티스토리 뷰
● 선택정렬(Selection sort)?
- Selection sort 또한 Bubble sort와 마찬가지로 구현이 그다지 어렵지 않은 알고리즘이다.
- 반대로 말하면 Selection sort 또한 Bubble sort와 마찬가지로 성능이 좋다고 할 수는 없다.
- Selection sort는 배열의 정렬되지 않은 영역의 첫 번째 원소(가장 앞 원소)를 시작으로 마지막 원소까지 비교 후 가장 작은 값을 첫 번째 원소로 가져온다.
ex)
[6, 3, 4, 1, 2, 5]
- 위의 배열이 한 번도 Selection sort를 거치지 않은 배열이라고 했을 때 배열의 정렬되지 않은 영역은 아래와 같다.
- 정렬되지 않은 영역의 첫 번째 원소(index[0] = 6)를 시작으로 마지막 원소까지 비교 후 가장 작은 값은 (index[3] = 1)이기에 (index[3] = 1)과 (index[0] = 6)의 위치를 교체한다.
- 이후에 정렬된 영역과 정렬되지 않은 영역은 아래와 같이 된다.
- 다시 한 번 정렬되지 않은 영역의 첫 번째 원소(index[1] = 3)와 마지막 원소까지 비교 후 가장 작은 값(index[4] = 2)을 첫 번째 원소로 가져온다.
- 정렬이 완료된 영역(index[0] = 1)은 더 이상 참조할 필요가 없다.
- 이후에 정렬된 영역과 정렬되지 않은 영역은 아래와 같이 된다.
- 이러한 작업을 배열의 끝까지 반복하면 그게 바로 Selection sort이다.
[1, 2, 3, 4, 5, 6] --> Selection sort가 모두 끝난 후의 모습
● Selection sort 구현
function selectionSort(arr) {
for (let i = 0; i < arr.length - 1; i++) {
let minValueIndex = i; // 정렬되지 않은 영역의 원소 중 최소값을 가지는 원소의 index
// 정렬되지 않은 영역의 (첫 번째 원소 ~ 마지막 원소)까지 순회하며 가장 작은 값을 찾기 위한 for문
for(let j = i + 1; j < arr.length; j++) {
if(arr[j] < arr[minValueIndex]) {
// 순회 중 arr[minValueIndex] 보다 작은 값을 발견하면 minValueIndex에 해당 원소의 index 값을 저장
minValueIndex = j;
}
}
let temp = arr[i];
arr[i] = arr[minValueIndex];
arr[minValueIndex] = temp;
}
}
let arr = [4, 2, 1, 3];
console.log("========== 정렬 전 ==========");
console.log(arr);
selectionSort(arr);
console.log("========== 정렬 후 ==========");
console.log(arr);
(arr.length - 1)
- 마지막 원소는 자동으로 정렬이 되기 때문에 배열의 원소가 n개라면 n-1번 반복시킨다.
ex) let arr = [1, 4, 2, 3]
--> arr의 length = 4 이므로 3번만 반복하면 된다.
--> 1번 반복 : [1, 4, 2, 3]
--> 2번 반복 : [1, 2, 4, 3]
--> 3번 반복 : [1, 2, 3, 4]
(let minValueIndex = i;)
- minValueIndex의 값으로 0이 아닌 i 를 넣어주는 이유는
- 반복을 한 번씩 진행할 때마다 최소값이 하나씩 정렬되기 때문에 이미 정렬된 영역은 반복에서 제외하기 위함이다.
(let j = i + 1)
- i의 값은 이미 minValueIndex에 저장했기 때문에 j의 값은 (i + 1)로 설정
● Selection sort 성능과 장단점
- Selection sort 또한 Bubble sort와 마찬가지로 바깥쪽 for 문이 실행될수록 안쪽 for 문이 줄어드는 형태이다.
- 이를 수학식으로 표현하면 위와 같다.
- Selection sort 또한 Bubble sort와 동일한 수식을 가지며 이는 곧 Selection sort의 성능이 O(n^2)라는 것을 의미한다.
- 핵심 계산 부분이 for 문 2개이니 O(n^2) 성능이라는 것을 유추할 수 있다.
Selection sort 장점 | Selection sort 단점 |
Bubble sort 마찬가지로 이해와 구현이 간단 | 성능이 O(n^2)으로 좋지 않다. |
'CS > 자료구조 및 알고리즘' 카테고리의 다른 글
#12 그래프(Graph) - 2차원 배열, 연결리스트를 이용한 구현 (0) | 2023.03.18 |
---|---|
#11 삽입정렬(Insertion Sort) (0) | 2023.03.07 |
#9 버블정렬(Bubble Sort) (0) | 2023.02.23 |
#8 해시테이블 - 개념(해시, 해시 함수) / ChatGPT 사용해봄 (1) | 2023.02.20 |
#7 큐(Queue) - 개념(FIFO : First In First Out) (0) | 2023.02.05 |
- Total
- Today
- Yesterday
- 코테
- OS
- node.js
- 빅데이터 분석기사
- 빅데이터
- 메모리
- Stream
- Spring Boot
- 알고리즘
- Advanced Stream
- SQL
- API
- 프로그래머스
- Phaser3
- jpa
- spring
- DART
- java
- 코딩테스트
- MongoDB
- 자료구조
- 운영체제
- Java8
- db
- git
- SpringBoot
- MySQL
- Phaser
- nosql
- 프로세스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 | 31 |