
정렬 알고리즘은 배열과 같은 컬렉션 내의 항목을 재배열하는 과정을 말한다. 정렬 알고리즘은 여러 종류가 있는데, 버블 정렬 알고리즘에 대해 정리해 보자.
버블 정렬은 가장 비효율적인 정렬 방식 중 하나로, 실제로는 잘 사용되지 않는다.
버블 정렬은 아래와 같은 방식으로 동작한다.
작동 방식은 아래 링크에서 시각화된 차트를 통해 확인할 수 있다.
const bubbleSort = (arr) => {
  let noSwaps;
  const swap = (arr, idx1, idx2) => {
    [arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]];
    noSwaps = false;
  }
  for (let i = arr.length; i > 0; i--) {
    noSwaps = true;
    for (let j = 0; j < i - 1; j++) {
      if (arr[j] > arr[j + 1]) {
        swap(arr, j, j + 1);
      }
    }
    if (noSwaps) break;
  }
  return arr;
}
console.log(bubbleSort([1, 2, 3, 10, 5, 6])); // [1, 2, 3, 5, 6, 10]
버블 정렬은 최적화되지 않은 경우 이미 정렬된 배열에서도 모든 요소를 비교한다. 이를 최적화하기 위해 noSwaps 변수를 사용할 수 있다. noSwaps 변수는 배열을 한 번 순회하는 동안 요소의 교환이 발생했는지를 체크한다. 
noSwaps를 false로 설정한다.break를 사용한다.이 최적화를 통해 불필요한 반복을 줄여 알고리즘의 효율성을 높일 수 있다.
버블 정렬은 일반적으로는 O(n²)의 복잡도를 가진다. 배열이 거의 정렬된 상태이고, noSwap을 사용한 경우에는 O(n)의 복잡도를 가진다.