버블정렬

하태현·2021년 11월 15일
0

알고리즘

목록 보기
4/4
const bubbleSort = (arr) => {
  let swapped = true;
  const len = arr.length;
  const res = arr.slice();

  for (let i = 1; i < len; i++) {
    swapped = false;
    console.log(res, i);
    for (let j = 0; j < len - i; j++) {
      if (res[j] > res[j + 1]) {
        [res[j], res[j + 1]] = [res[j + 1], res[j]];
        swapped = true;
      }
    }
    if (!swapped) break;
  }
  return res;
};
const a = [5, 2, 6, 3, 1, 4, 9, 8, 7];
const sortedArr = bubbleSort(a);

console.log('prev', a);
console.log('sortedArr', sortedArr);

두 개씩 비교 하므로 N-1 의 아이템을 비교 한다.
for (let i = 1; i < len; i++) {
ex) 배열의 길이가 9이면 최대 8번의 루프가 돈다.
(0 ~ len-1, 1 ~ len 등 형식은 상관없다. N-1이란 것을 명심 하도록 하자)

버블정렬은 가장 큰 숫자를 뒤로 보낸다.
for (let j = 0; j < len - i; j++)
첫 사이클때 가장 큰 수는 맨 뒤로 가기때문에 다음 사이클에선 맨 뒷자리를 신경쓸 필요없다.
위 예제에서 사이클 마다 정렬된 배열을 출력해 보았다. 첫 사이클 (i=1)이 끝나고 다음 사이클(i=2)에서 9가 맨 뒤에 있다.
그래서 다음 사이클에서는 마지막 index는 확인할 필요가 없기에
innerLoop의 횟수를 len-i로 확인해야할 마지막 인덱스를 줄여 준다.

if(noSwap) 문에서 break 가 없다면 위 사진을 확인하면 5번째 사이클에서 배열의 정렬이 완료 되었다. 하지만 이후로도 불필요한 반복문이 실행된다.
그래서 swap이 일어나지 않는다면 반복문을 종료함으로써 반복횟수를 줄일수 있다.

profile
왜?를 생각하며 개발하기, 다양한 프로젝트를 경험하는 것 또한 중요하지만 내가 사용하는 기술이 어떤 배경과 이유에서 만들어진 건지, 코드를 작성할 때에도 이게 최선의 방법인지를 끊임없이 질문하고 고민하자. 이 과정은 앞으로 개발자로 커리어를 쌓아 나갈 때 중요한 발판이 될 것이다.

0개의 댓글