분할정복 방법
function quickSort(arr) {
// 배열의 요소가 하나만 남으면 값을 반환 후 종료된다.
if (arr.length <= 1) {
return arr;
}
const pivot = arr[0]; // 0번 인덱스를 기준(pivot)으로 둔다.
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]);
}
}
return [...quickSort(left),pivot,...quickSort(right)];
// return에서 다시 함수를 불러와 배열의 요소가 하나만 남을 때까지 돌린다.
}
(ex) [1,2,3,4,5,6,7,8,9,10] 의 정렬된 배열이 있을 때,
1을 pivot으로 둔다면, 자신 보다 작은 값을 찾기 위해 10까지 탐색하지만 10까지가도 없으니까 다시 돌아와서 1만 정렬한다. 이것을 10번 반복하게 될 것이다. 그러면 O(n^2) 의 시간이 걸린다.
function mergeSort(arr) {
if (arr.length <= 1) {
return arr;
}
const mid = Math.floor(arr.length / 2); // Math.floor 내림 메서드
const left = arr.slice(0, mid);
const right = arr.slice(mid);
// 이 식들은 배열을 세 부분으로 나누어주는 역할
return merge(mergeSort(left), mergeSort(right)); //배열의 크기가 1이하가 될때까지 계속 나눠줄 것이다.
}
function merge(left, right) { // 배열 요소 크기를 비교한 후 정렬 및 병합 하는 함수
let result = [];
while (left.length && right.length) {
if (left[0] < right[0]) { // 배열 요소의 크기를 비교한 후 크기에 맞게 result 배열에 넣어준다.
result.push(left.shift());
} else {
result.push(right.shift());
}
}
while (left.length) {
result.push(left.shift())
}
while (right.length) {
result.push(right.shift())
}
return result;
}
최대 힙 트리
나 최소 힙 트리
를 구성하여 정렬하는 방식(즉, 부모의 값이 자식의 값보다 항상 크거나 항상 작다) 최대 힙 트리
를 구성하고 오름차순 정렬을 위해서는 최소 힙 트리
를 구성하여 정렬을 하는 방법힙(Heap)
: 완전 이진 트리의 일종으로 우선순위 큐를 위해 만들어진 자료구조,
힙은 배열을 사용해 표현한 트리와 같은 자료 구조라고 할 수 있음
우선순위 큐
: 우선순위의 개념을 큐에 도입한 자료 구조로 데이터들이 우선순위를 가지고 있고 우선순위가 높은 데이터가 먼저 나간다.
완전 이진 트리
: 삽입할 때 왼쪽부터 차례대로 추가하는 이진 트리
최대 힙 트리
: 부모 노드의 키 값이 자식 노드의 키 값보다 크거나 같은 완전 이진 트리
최소 힙 트리
: 부모 노드의 키 값이 자식 노드의 키 값보다 작거나 같은 완전 이진 트리
- 과정 설명
- 정렬해야 할 n개의 요소들로 최대 힙(완전 이진 트리 형태)을 만든다.
- 내림차순을 기준으로 정렬
- 그 다음으로 한 번에 하나씩 요소를 힙에서 꺼내서 배열의 뒤부터 저장하면 된다.
- 삭제되는 요소들(최댓값부터 삭제)은 값이 감소되는 순서로 정렬되게 된다.