방대한 문제를 조금씩 조금씩 나눠가면서 용이하게 풀 수 있는 문제 단위로 나눈 후 해결하고, 결과값을 다시 합쳐서 해결하는 방법(재귀적).
분할(Divide)
기존문제를 작은 부분문제들로 나눈다.
정복(Conquer)
각 부분문제를 해결한다.
상황에따라 다시 divide, conquer, combine 으로 쪼개질 수 있다.
결합(Combine)
부분문제들의 해결한 것을 통해 기존문제를 해결.
재귀 알고리즘: 재귀적으로 문제를 해결하지만 반드시 분할과 정복의 구조를 따르지는 않습니다.
분할정복 알고리즘: 문제를 분할하고, 정복하며, 결합하여 해결하는 재귀 알고리즘의 특수 형태입니다.
재귀 알고리즘:
분할정복 알고리즘:

리스트를 절반으로 나누고(분할) 각 부분을 재귀적으로 정렬한 후(정복), 두 정렬된 부분을 합쳐서 전체를 정렬(병합)하는 알고리즘.
분할(Divide): 입력 리스트를 같은 크기의 두 개의 부분 리스트로 분할합니다.
이때 분할은 리스트의 중간 지점에서 수행됩니다.
정복(Conquer): 각 부분 리스트를 재귀적으로 병합정렬을 이용해 정렬합니다.
이 과정은 입력 리스트의 크기가 충분히 작아질 때까지 반복됩니다.
병합(Merge): 정렬된 두 부분 리스트를 하나의 정렬된 리스트로 병합합니다.
주로 배열이나 문자열 같은 큰 규모의 데이터셋을 처리한다.

배열을 더작은 배열로 나누고, 가장 작은 하위배열부터 정렬하는 방식.
초기배열
첫번째분할
두번째분할
세번째분할
첫번째정렬
두번째정렬
세번쩨병합정렬

// 병합 정렬 함수
function mergeSort(arr) {
// 배열의 길이가 1 이하인 경우, 이미 정렬된 상태이므로 배열을 그대로 반환합니다.
if (arr.length <= 1) {
return arr;
}
// 배열을 중간 지점에서 두 개의 하위 배열로 분할합니다.
const mid = Math.floor(arr.length / 2);
const left = arr.slice(0, mid);
const right = arr.slice(mid);
// 재귀적으로 하위 배열을 정렬합니다.
return merge(mergeSort(left), mergeSort(right));
}
// 두 개의 정렬된 배열을 병합하는 함수
function merge(left, right) {
let result = [];
let leftIndex = 0;
let rightIndex = 0;
// 두 배열의 요소를 비교하여 작은 요소를 결과 배열에 추가합니다.
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
result.push(left[leftIndex]);
leftIndex++;
} else {
result.push(right[rightIndex]);
rightIndex++;
}
}
// 왼쪽 배열에 남은 요소를 결과 배열에 추가합니다.
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
}
// 예제 사용
const array = [34, 7, 23, 32, 5, 62];
console.log(mergeSort(array)); // [5, 7, 23, 32, 34, 62]
merge Sort)Base Case:
if (arr.length <= 1) {
return arr;
}
분할(Divide):
const mid = Math.floor(arr.length / 2);
const left = arr.slice(0, mid);
const right = arr.slice(mid);
mid는 배열을 반으로 나누는 인덱스를 계산합니다.left는 배열의 왼쪽 절반을, right는 배열의 오른쪽 절반을 의미합니다.재귀 호출(Recursive Call):
return merge(mergeSort(left), mergeSort(right));
mergeSort 함수를 재귀적으로 호출하여 하위 배열을 정렬합니다.merge 함수로 병합합니다.merge)초기 설정:
let result = [];
let leftIndex = 0;
let rightIndex = 0;
result를 초기화합니다.leftIndex와 rightIndex를 초기화합니다.병합(Merge):
while (leftIndex < left.length && rightIndex < right.length) {
if (left[leftIndex] < right[rightIndex]) {
result.push(left[leftIndex]);
leftIndex++;
} else {
result.push(right[rightIndex]);
rightIndex++;
}
}
left와 right 배열의 현재 요소를 비교하여 더 작은 요소를 result 배열에 추가합니다.남은 요소 추가:
return result.concat(left.slice(leftIndex)).concat(right.slice(rightIndex));
left 배열에 남은 요소를 result 배열에 추가합니다.right 배열에 남은 요소를 result 배열에 추가합니다.const array = [34, 7, 23, 32, 5, 62];
console.log(mergeSort(array)); // [5, 7, 23, 32, 34, 62]
mergeSort 함수를 호출하여 배열을 정렬합니다.[5, 7, 23, 32, 34, 62]입니다.장점:
단점:

배열에서 하나의 피벗(pivot)을 선택하고, 피벗을 기준으로 배열을 두 부분으로 나눈 후, 각 부분을 재귀적으로 정렬하는 방식.
코드
// 퀵 정렬 함수
function quickSort(arr) {
// 배열의 길이가 1 이하인 경우, 이미 정렬된 상태이므로 배열을 그대로 반환합니다.
if (arr.length <= 1) {
return arr;
}
// 피벗을 배열의 중간 요소로 선택합니다.
const pivot = arr[Math.floor(arr.length / 2)];
const left = [];
const right = [];
const equal = [];
// 배열을 피벗을 기준으로 세 부분으로 분할합니다.
for (let num of arr) {
if (num < pivot) {
left.push(num);
} else if (num > pivot) {
right.push(num);
} else {
equal.push(num);
}
}
// 재귀적으로 하위 배열을 정렬하고, 정렬된 배열을 병합합니다.
return quickSort(left).concat(equal).concat(quickSort(right));
}
// 예제 사용
const array = [34, 7, 23, 32, 5, 62];
console.log(quickSort(array)); // [5, 7, 23, 32, 34, 62]
quickSort)Base Case:
if (arr.length <= 1) {
return arr;
}
피벗 선택(Pivot Selection):
const pivot = arr[Math.floor(arr.length / 2)];
분할(Divide):
const left = [];
const right = [];
const equal = [];
for (let num of arr) {
if (num < pivot) {
left.push(num);
} else if (num > pivot) {
right.push(num);
} else {
equal.push(num);
}
}
left, right, equal 세 부분으로 나눕니다.left에는 피벗보다 작은 요소들, right에는 피벗보다 큰 요소들, equal에는 피벗과 같은 요소들을 저장합니다.재귀 호출(Recursive Call) 및 병합(Concatenate):
return quickSort(left).concat(equal).concat(quickSort(right));
quickSort 함수를 재귀적으로 호출하여 left와 right 하위 배열을 정렬합니다.left 배열, equal 배열, 정렬된 right 배열을 병합하여 최종 정렬된 배열을 반환합니다.const array = [34, 7, 23, 32, 5, 62];
console.log(quickSort(array)); // [5, 7, 23, 32, 34, 62]
quickSort 함수를 호출하여 배열을 정렬합니다.[5, 7, 23, 32, 34, 62]입니다.초기 배열:
[34, 7, 23, 32, 5, 62]
첫 번째 피벗 선택: 피벗 = 23
left = [7, 5]equal = [23]right = [34, 32, 62]재귀 호출 및 정렬:
quickSort(left) 호출: [7, 5] -> [5, 7]quickSort(right) 호출: [34, 32, 62] -> [32, 34, 62]병합:
[5, 7].concat([23]).concat([32, 34, 62])
= [5, 7, 23, 32, 34, 62]
최종적으로, 배열이 정렬된 상태로 반환됩니다.
장점:
단점:

오름차순으로 정렬된 리스트에서 특정한 값의 위치를 찾는 알고리즘.
찾는 값(target)과 중간값(mid)을 비교하여, 그 결과에 따라 탐색 범위를 계속해서 재설정하는 방식.
정렬된 배열에서 중간 요소를 선택하고, 찾고자 하는 값과 비교하여 절반으로 나누어 탐색을 반복.
중간 값 선택:
배열의 중간 값을 선택합니다.
값 비교:
찾고자 하는 값과 중간 값을 비교합니다.
반복 또는 재귀 호출:
위의 과정을 반복 또는 재귀 호출하여 값을 찾습니다.
값을 찾지 못한 경우:
검색 범위가 더 이상 존재하지 않으면 값이 배열에 없다는 것을 의미하므로, 검색 실패를 반환합니다.
코드
function binarySearch(arr, target, left = 0, right = arr.length - 1) {
// base case: 검색 범위가 더 이상 존재하지 않을 때
if (left > right) {
return -1; // 값을 찾지 못한 경우 -1 반환
}
// 중간 인덱스를 계산
const mid = Math.floor((left + right) / 2);
// 중간 값과 타겟 값을 비교
if (arr[mid] === target) {
return mid; // 값을 찾으면 인덱스를 반환
} else if (arr[mid] < target) {
// 중간 값보다 타겟 값이 크면 오른쪽 부분을 검색
return binarySearch(arr, target, mid + 1, right);
} else {
// 중간 값보다 타겟 값이 작으면 왼쪽 부분을 검색
return binarySearch(arr, target, left, mid - 1);
}
}
// 예제 사용
const array = [1, 3, 5, 7, 9, 11, 13, 15];
const target = 7;
const index = binarySearch(array, target);
console.log(index); // 3 (7은 배열의 인덱스 3에 위치)
Base Case:
if (left > right) {
return -1; // 값을 찾지 못한 경우 -1 반환
}
중간 인덱스 계산:
const mid = Math.floor((left + right) / 2);
중간 값과 타겟 값 비교:
if (arr[mid] === target) {
return mid; // 값을 찾으면 인덱스를 반환
} else if (arr[mid] < target) {
return binarySearch(arr, target, mid + 1, right); // 오른쪽 부분을 검색
} else {
return binarySearch(arr, target, left, mid - 1); // 왼쪽 부분을 검색
}
const array = [1, 3, 5, 7, 9, 11, 13, 15];
const target = 7;
const index = binarySearch(array, target);
console.log(index); // 3 (7은 배열의 인덱스 3에 위치)
binarySearch 함수를 호출하여 배열에서 타겟 값을 검색합니다.빠른 검색 속도:
단순한 구현:
메모리 효율성:
정렬된 배열 필요:
데이터 구조 제약:
삽입/삭제 비용:
초기 배열:
[1, 3, 5, 7, 9, 11, 13, 15]
첫 번째 중간 값 선택:
중간 값 = 7, 인덱스 = 3
값 비교:
결과:
값 7의 인덱스는 3입니다.
장점:
단점: