티스토리 뷰
코딩테스트/알고리즘 & 자료구조 개념
[알고리즘 | JS] sorting algorithm(정렬 알고리즘)2 - selection sort
blueprint-12 2023. 2. 21. 19:18Selection Sort (선택정렬)
-버블 정렬과 비슷하지만, 큰 값을 배열 끝에 위치시키는 대신 작은 값을 한 번에 하나씩 위치에 배열한다.
- 버블 정렬과 마찬가지로 처음부터 끝까지 움직이지만, 실제 정렬된 데이터는 처음부터 누적되고 있다.
- 첫 요소와 모든 요소를 비교 후, 비교 대상 중 최솟값을 찾아 마지막 swap을 통해 첫 요소와 최소값인 요소의 자리를 바꾼다(만일 첫번째 요소가 비교를 전부 끝냈을 때 최솟값이라면 자리를 이동하지 않는다-> noSwap).
버블 정렬 만들기 tip
- 우선 최솟값을 담을 변수를 만들어준다. 최솟값의 초기값은 첫번째 요소의 값으로 설정할 수 있다.
- 저장하려는 변수 값은 최소값이 담긴 요소의 인덱스이다.
- 모든 단일 항복들에 대해 반복할 필요는 없다.
- 실제로 해야할 것은 그 이후의 다음 항목부터 시작하여 새로운 최솟값을 찾는 일이다.
- 루프에 다른 루프와 단일 조건을 더하고 끝에서 바꾼다(swap)
2. 버블 정렬 예시
selectionSort.js
// selction sort example
{
function selectionSort(arr) {
for (let i = 0; i < arr.length; i++) {
let lowest = i;
for (let j = i + 1; j < arr.length; j++) {
//console.log(i, j);
if (arr[j] < arr[lowest]) {
lowest = j;
}
}
if (i !== lowest) {
console.log(i, lowest);
/*2 4
3 6
4 5
5 6
*/
//SWAP function
let temp = arr[i];
arr[i] = arr[lowest];
arr[lowest] = temp;
}
}
return arr;
}
console.log(selectionSort([0, 2, 34, 22, 10, 18, 17]));
/*
[0, 2, 10, 17, 18, 22, 34]
*/
}
//ES2015 ver
{
function selectionSort(arr) {
const swap = (arr, idx1, idx2) =>
([arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]]);
for (let i = 0; i < arr.length; i++) {
let lowest = i;
for (let j = i + 1; j < arr.length; j++) {
if (arr[lowest] > arr[j]) {
lowest = j;
}
}
if (i !== lowest) swap(arr, i, lowest);
}
return arr;
}
}
3. 선택 정렬의 시간복잡도
- 선택 정렬을 엄청나게 효율적이지는 않다. => O(n^2)
- 선택 정렬이 잠재적으로 버블 정렬보다 나은 시나리오는 단 한가지이다. -> 바로 SWAP의 수를 최소화하는 경우이다.
- 버블 정렬은 매 비교 순간에 swap을 하지만, 선택 정렬은 각 루프가 끝날 때 한 번만 swap하기 때문이다.
'코딩테스트 > 알고리즘 & 자료구조 개념' 카테고리의 다른 글
[알고리즘 | JS] sorting algorithm(정렬 알고리즘)4 - merge sort (0) | 2023.02.22 |
---|---|
[알고리즘 | JS] sorting algorithm(정렬 알고리즘)3 - insertion sort (0) | 2023.02.21 |
[알고리즘 | JS] sorting algorithm(정렬 알고리즘) - bubble sort (0) | 2023.02.20 |
[알고리즘 | JS] 검색과 검색 알고리즘(search algorithm) (0) | 2023.02.19 |
[알고리즘 | JS] Helper method recursion(헬퍼 함수 or 헬퍼 메소드 재귀) (0) | 2023.02.17 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 원티드 FE 프리온보딩 챌린지
- D 플래그
- 형제 요소 선택자
- nvm 설치순서
- 타입스크립트 DT
- Prittier
- ~ ^
- reactAPI
- tilde caret
- getStaticPaths
- is()
- 항해99프론트
- 원티드 3월 프론트엔드 챌린지
- 항해99추천비추천
- fs모듈 넥스트
- 원티드 프리온보딩 FE 챌린지
- text input pattern
- 프리온보딩 프론트엔드 챌린지 3월
- grid flex
- getServerSideProps
- aspect-ratio
- float 레이아웃
- nvm경로 오류
- 항해99프론트후기
- 부트캠프항해
- 원티드 프리온보딩 프론트엔드 챌린지 3일차
- 프리렌더링확인법
- 타입스크립트 장점
- && 셸 명령어
- 틸드와 캐럿
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함