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이 일어나지 않는다면 반복문을 종료함으로써 반복횟수를 줄일수 있다.