Published on

버블정렬과 선택정렬 (bubble sort, selection sort)

버블정렬과 선택정렬은 구현이 간단하지만 비효율적이다. 둘 다 시간복잡도는 O(n^2)이다.

버블정렬 알고리즘

  • 버블 정렬은 첫 번째 자료와 두 번째 자료를, 두 번째 자료와 세 번째 자료를, 세 번째와 네 번째를 ... 이런 식으로 (마지막-1)번째 자료와 마지막 자료를 비교하여 교환하면서 자료를 정렬한다.

  • 1회전을 수행하고 나면 가장 큰 자료가 맨 뒤로 이동하므로 2회전에서는 맨 끝에 있는 자료는 정렬에서 제외되고, 2회전을 수행하고 나면 끝에서 두 번째 자료까지는 정렬에서 제외된다. 이렇게 정렬을 1회전 수행할 때마다 정렬에서 제외되는 데이터가 하나씩 늘어난다.

function bubbleSort(arr) {
  let result = [...arr]; // 원본 데이터 복사

  for (let i = 0; i < result.length - 1; i++) {
    for (let j = 0; j < result.length - i; j++) {
      if (result[j] > result[j + 1]) {
        let temp = result[j];
        result[j] = result[j + 1];
        result[j + 1] = temp;
      }
    }
  }

  return result;
}

let items = [8, 4, 9, 2, 5, 10, 15, 22, 88, 63, 18];
bubbleSort(items); // [2, 4, 5, 8, 9, 10, 15, 18, 22, 63, 88]

선택정렬 알고리즘

  • 주어진 배열 중에서 최솟값을 찾는다.
  • 그 값을 맨 앞에 위치한 값과 교체한다(패스(pass)).
  • 맨 처음 위치를 뺀 나머지 리스트를 같은 방법으로 교체한다.
  • 하나의 원소만 남을 때까지 위의 과정을 반복한다.
function selectionSort(arr = []) {
  // copy array
  let result = [...arr];

  for (let i = 0; i < result.length - 1; i++) {
    // 현재 인덱스를 최소값이라고 가정한다.
    let minimunNumberPos = i;

    // 오직 정렬되지 않은 배열에서만 탐색하기 위해서 j를 i + 1로 설정한다.
    for (let j = i + 1; j < result.length; j++) {
      if (result[minimunNumberPos] > result[j]) {
        minimunNumberPos = j;
      }
    }

    // swap
    if (minimunNumberPos !== i) {
      let temp = result[minimunNumberPos];
      result[minimunNumberPos] = result[i];
      result[i] = temp;
    }
  }

  return result;
}

console.log(selectionSort([2, 1, 4, 3, 5])); // [1,2,3,4,5]