프로그래밍/알고리즘
[알고리즘 문제 풀이] 퀵 정렬, 정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다.
공부하는EJ
2022. 6. 14. 08:34
728x90
💡 퀵 정렬 (Quick Sort)
- '찰스 앤터니 리처드 호어' 가 개발한 알고리즘.
- 퀵 정렬은 불안정 저렬에 속하며, 다른 원소와 비교만으로 정렬을 수행하는 비교 정렬에 속한다.
- 분할 정보 알고리즘의 하나로, 평균적으로 매우 빠른 속도를 자랑함.
방법
1) 리스트 안에 있는 한 요소를 서택한다. 이렇게 고른 원소의 크기를 피벗이라고 한다.
2) 피벗을 기준으로 피벗보다 작은 요소들은 왼쪽, 큰 요소들은 오른쪽에 옮긴다.
3) 부분 리스트들이 더이상 불가능할 때까지 반복한다.
quickSort
문제
정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다.
입력
인자 1 : arr
- number 타입을 요소로 갖는 배열
- arr[i]는 정수
- arr.length는 100,000 이하
출력
- number 타입을 요소로 갖는 배열을 리턴해야 합니다.
- 배열의 요소는 오름차순으로 정렬되어야 합니다.
- arr[i] <= arr[j] (i < j)
주의사항
- 퀵 정렬을 구현해야 합니다.
- arr.sort 사용은 금지됩니다.
- 입력으로 주어진 배열은 중첩되지 않은 1차원 배열입니다.
입출력 예시
let output = quickSort([3, 1, 21]);
console.log(output); // --> [1, 3, 21]
Advanced
- quickSort 함수의 두 번째 인자로 callback 함수를 받아서, 그 함수의 리턴값을 기준으로 요소들을 정렬해 보세요.
💡두 번째 인자 callback 함수 안 쓰고 구현
const quickSort = function (arr) {
// TODO: 여기에 코드를 작성합니다.
if (arr.length <= 1) return arr;
const pivot = arr[0];
const left = [];
const right = [];
for (let i = 1; i < arr.length; i++) {
if (arr[i] < pivot) left.push(arr[i]);
else right.push(arr[i]);
}
const lSorted = quickSort(left);
const rSorted = quickSort(right);
return [...lSorted, pivot, ...rSorted];
};
💡두 번째 인자 callback 함수 쓰고 구현
const quickSort = function (arr, transform=(item) => item) {
// TODO: 여기에 코드를 작성합니다.
if (arr.length <= 1) return arr;
const pivot = arr[0];
const left = [];
const right = [];
for (let i = 1; i < arr.length; i++) {
if (transform(arr[i]) < transform(pivot)) left.push(arr[i]);
else right.push(arr[i]);
}
const lSorted = quickSort(left, transform);
const rSorted = quickSort(right, transform);
return [...lSorted, pivot, ...rSorted];
};
사실 이 두개의 큰 차이를 아직은 모르겠다. 더 공부해봐야지!
728x90