3. 병합정렬(merge sort)

  • 시간복잡도: O(nLogn) — 빠름

  • 배열의 요소가 1개가 될 때까지 배열을 1/2씩 분할

  • 분할한 배열의 요소들을 순서대로 0번째 인덱스끼리 비교 정렬하여 정복

// 분할
[1, 11, 66, 77, 55, 33, 88, 99]

[1, 11, 66, 77], [55, 33, 88, 99]

[1, 11], [66, 77], [55, 33], [88, 99]

[1], [11], [66], [77], [55], [33], [88], [99]

// 정복
[1, 11], [66, 77], [33, 55], [88, 99]
// 0번째 인덱스 끼리 비교
[],[],[66, 77], [33, 55], [88, 99]
[],[],[66, 77], [], [], [88, 99]
[1, 11, 66, 77], [33, 55, 88, 99]
[1, 11, 33, 55, 66, 77, 88, 99]

// **재귀함수**
let arr = [1, 11, 66, 77, 55, 33, 88, 99]; // 입력 배열

// 분할
function mergeSort(arr) {
  let length = arr.length;
  if(length <= 1) {
    return arr;
  }
  let middleIdx = parseInt(length/2)
  let group1 = mergeSort(arr.slice(0, middleIdx));
  let group2 = mergeSort(arr.slice(middleIdx));
  return `group1: ${group1}, group2: ${group2}\n`
}
console.log(mergeSort(arr))

/* group1: group1: group1: **1**, group2: **11**
, group2: group1: **66**, group2: **77**

, group2: group1: group1: **55**, group2: **33**
, group2: group1: **88**, group2: **99** */

// **재귀함수**
let arr = [1, 11, 66, 77, 55, 33, 88, 99]; // 입력 배열

// 분할, 정복
function mergeSort(arr) {
  let length = arr.length;
  let result = []; // 결과값
  if(length <= 1) {
    return arr;
  }
  let middleIdx = parseInt(length/2)
  let group1 = mergeSort(arr.slice(0, middleIdx));
  let group2 = mergeSort(arr.slice(middleIdx));

  // group1, group2 모두 요소가 남아있을 때,
  while(group1.length !== 0 && group2.length !== 0) {
    if(group1[0] < group2[0]) {
     result.push(group1.shift());
    } else {
     result.push(group2.shift());
    }
  }
  // group1만 요소가 남아있을 때,
  while(group1.length !== 0) {
     result.push(group1.shift());
  }

  // group2만 요소가 남아있을 때,
  while(group2.length !== 0) {
     result.push(group2.shift());
  }
  return result;
}

console.log(mergeSort(arr))
// [1, 11, 33, 55, 66, 77, 88, 99]

Last updated