Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C
- 배열
- 릿코드
- 프로세스
- 타입스크립트
- 이진탐색
- RT scheduling
- 프로그래머스
- cors
- 큐
- 연결 리스트
- GraphQL
- 자바스크립트
- 포인터
- 알고리즘
- 해시테이블
- 자료구조
- 프론트엔드
- APOLLO
- 연결리스트
- pytorch
- 스택
- 브라우저
- Machine Learning
- alexnet
- 컨테이너
- 웹팩
- RxJS
- vue3
- 코딩테스트
Archives
- Today
- Total
프린세스 다이어리
자바스크립트 핵간단한 퀵정렬 코드 본문
728x90
퀵 정렬은 정렬 알고리즘이다. 선택 정렬보다 훨씬 빠르고 실제로도 많이 사용된다. C언어 표준 라이브러리에는 qsort라는 함수가 있는데 이것이 바로 퀵 정렬을 구현한 함수다. 퀵 정렬은 분할 정복 전략 중에 하나다.
배열을 정렬할 때 가장 간단하고 연산이 적은 배열은 무엇일까? 바로 정렬할 필요도 없는 배열이다.
- [] (비어 있는 배열)
- [5] (원소가 하나인 배열)
비어 있는 배열이나 원소가 하나인 배열이 기본 단계가 된다. 이 경우, 배열을 있는 그대로 반환하면 된다.
function quickSort(arr) {
if (arr.length <= 1) return arr;
}
퀵 정렬은 분할 정복 전략 중에 하나이기 때문에, 배열을 기본 단계, 즉 비어 있는 배열이나 원소가 하나인 배열이 될 때까지 나눠야 한다. 퀵 정렬의 동작은 다음과 같다.
- 배열에서 원소 하나를 고른다.
- 기준 원소보다 작은 원소는 작은 원소의 배열, 기준 원소보다 큰 원소는 큰 원소의 배열로 분할한다.
- 하위 배열에 대해 재귀적으로 퀵 정렬 함수를 호출한다.
만약 [5, 13, 9]라는 세 개의 원소가 있다면, 처음에 quickSort([5, 12, 9])처럼 인자가 들어갔다가, 그 함수 내부에서 기준 원소를 한 개 골라 그 기준 원소보다 작은 원소들의 배열을 quickSort 해주고, 큰 원소들의 배열을 quickSort 해주면 된다.
return [...quickSort([]), [5], ...quickSort([13, 9])];
위에서는 기준 원소를 배열의 인덱스 0에 해당하는 원소로 골랐는데, 이 기준 원소로 무엇을 고르더라도 마찬가지로 작동한다. 개인적으로 그냥 for문에서 i가 1로 시작하여 쭉 한 바퀴 도는 것이 깔끔해 보여서 첫 번째 원소로 잡는 게 좋다. 사실 별 생각 없이 그렇게 공부했다.
다음은 퀵 정렬을 구현한 코드다.
function quickSort(arr) {
if (arr.length <= 1) return arr;
let middle = arr[0];
let left = [];
let right = [];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < middle) {
left.push(arr[i])
} else {
right.push(arr[i])
}
}
return [...quickSort(left), middle, ...quickSort(right)];
}
728x90
'자료구조, 알고리즘' 카테고리의 다른 글
[프로그래머스] 가장 큰 수 문제 자바스크립트 풀이 (0) | 2021.11.01 |
---|---|
자바스크립트 핵간단한 이진탐색 구현 기본 템플릿 (0) | 2021.10.31 |
[프로그래머스] 주식가격 문제 C언어 스택 활용한 풀이 (0) | 2021.10.28 |
[프로그래머스] 다리를 지나는 트럭 문제 - 자바스크립트 배열, 연결 리스트 두가지 방법으로 (0) | 2021.10.27 |
자바스크립트로 연결 리스트(Linked List) 구현하기 (0) | 2021.10.26 |
Comments