병합 정렬은 병합 연산을 기반으로 하는 효과적인 정렬 알고리즘입니다. 이 알고리즘은 분할 정복(Divide and Conquer) 방식을 사용하는 매우 일반적인 응용 프로그램입니다.
병합 정렬 방법은 두 개 이상의 순서가 지정된 목록을 새로운 순서 목록으로 병합하는 것입니다. 즉, 정렬할 순서를 여러 하위 순서로 나누어 각 하위 순서를 정렬하는 것입니다. 그런 다음 정렬된 하위 시퀀스를 전체 정렬된 시퀀스에 병합합니다.
병합 정렬은 병합 연산을 기반으로 하는 효과적인 정렬 알고리즘입니다. 이 알고리즘은 분할 정복(Divide and Conquer) 방식을 사용하는 매우 일반적인 응용 프로그램입니다. 이미 정렬된 하위 시퀀스를 병합하여 완전히 정렬된 시퀀스를 얻습니다. 즉, 먼저 각 하위 시퀀스를 순서대로 만든 다음 하위 시퀀스 세그먼트를 순서대로 만듭니다. 두 개의 순서 목록이 하나의 순서 목록으로 병합되는 경우 이를 양방향 병합이라고 합니다.
병합 작업 과정은 다음과 같습니다.
1. 크기가 두 개의 정렬된 시퀀스의 합이 되도록 공간을 적용합니다. 이 공간은 병합된 시퀀스를 저장하는 데 사용됩니다.
2. 두 개의 정렬된 시퀀스의 초기 위치를 설정합니다. 시작 위치
3. 두 포인터가 가리키는 요소를 비교하고 상대적으로 작은 요소를 선택하여 병합 공간에 넣은 후 포인터를 다음 위치로 이동합니다
4. 특정 포인터가 나올 때까지 3단계를 반복합니다. 시퀀스의 끝에 도달
5. 다른 시퀀스의 나머지 모든 요소를 병합된 시퀀스의 끝에 직접 복사합니다
예 1:
/**
* 병합 알고리즘이라고도 불리는 병합 연산(merge)은 정렬된 두 시퀀스를 하나의 시퀀스로 병합하는 연산을 말합니다.
* 병합 정렬 알고리즘은 병합 작업에 의존합니다.
*
* 병합 작업 과정은 다음과 같습니다.
*
* 1. 정렬된 두 시퀀스의 합이 되도록 공간을 적용합니다. 이 공간은 병합된 내용을 저장하는 데 사용됩니다. 시퀀스
* 2. 두 개의 포인터를 설정합니다. 초기 위치는 두 개의 정렬된 시퀀스의 시작 위치입니다.
* 3. 두 포인터가 가리키는 요소를 비교하고 상대적으로 작은 요소를 선택하여 병합에 넣습니다. 공백을 입력하고 포인터를 다음 위치로 이동합니다.
* 4. 포인터가 시퀀스의 끝에 도달할 때까지 3단계를 반복합니다.
* 5. 다른 시퀀스의 나머지 모든 요소를 병합된 시퀀스의 끝에 직접 복사합니다.
*
*/
function mergeSort(items) {
if (items.length < 2) {
return items;
}
var middle = Math.floor(items.length / 2) ,
왼쪽 = items.slice(0, 중간),
오른쪽 = items.slice(가운데),
params = merge(mergeSort(왼쪽), mergeSort(오른쪽));
params.unshift(0, items.length);
items.splice.apply(items, params);
항목 반환;
함수 병합(왼쪽, 오른쪽) ) {
var result = [],
il = 0,
ir = 0;
while (il < left.length && ir < right.length) {
if ( 왼쪽[il] < 오른쪽[ir]) {
result.push(left[il]) > return result.concat(왼쪽.슬라이스(il)) .concat(오른쪽.슬라이스(ir) ); = [2, 1, 3, 12, 5, 66, 23, 87, 15, 32];
mergeSort(arr);
예 2:
코드 복사
코드는 다음과 같습니다.