정수를 요소로 갖는 배열을 입력받아 오름차순으로 정렬하여 리턴해야 합니다.
버블 정렬(bubble sort)은 여러 정렬 알고리즘(삽입 정렬, 퀵 정렬, 병합 정렬, 기수 정렬 등) 중 가장 기본적인 알고리즘입니다.
버블 정렬 알고리즘은 아래와 같습니다.
이 모습이 마치 '거품이 밀려 올라가는 것과 같은 모습'과 같아서 bubble sort라고 부릅니다.
number
타입을 요소로 갖는 배열arr[i]
는 정수arr[i]
의 길이는 1,000 이하number
타입을 요소로 갖는 배열을 리턴해야 합니다.arr[i] <= arr[j]
(i < j
)arr.sort
사용은 금지됩니다.let output = bubbleSort([2, 1, 3]);
console.log(output); // --> [1, 2, 3]
const bubbleSort = function (arr) {
let isSorted = false;
while(!isSorted) {
isSorted = true;
for (let i = 1; i < arr.length; i++) {
if (arr[i - 1] > arr[i]) {
isSorted = false;
let tempFile = arr[i - 1];
arr[i - 1] = arr[i];
arr[i] = tempFile;
}
}
}
return arr;
};
const swap = function (idx1, idx2, arr) {
// 두 변수를 바꾸는 방법
// 1) 임시 변수를 활용한 방법
let temp = arr[idx1];
arr[idx1] = arr[idx2];
arr[idx2] = temp;
// 2) Destructuring assignment를 활용한 방법
// arr이 reference type이라 가능
[arr[idx1], arr[idx2]] = [arr[idx2], arr[idx1]];
// 3) XOR 연산을 활용한 방법
// arr이 reference type이라 가능
arr[idx1] ^= arr[idx2];
arr[idx2] ^= arr[idx1];
arr[idx1] ^= arr[idx2];
};
// naive solution
// let bubbleSort = function (arr) {
// let N = arr.length;
// for (let i = 0; i < N - 1; i++) {
// // 매 반복(iteration)마다 i번째로 큰 수가 마지막에서 i번째 위치하게 된다.
// // 이미 정렬된 요소는 고려할 필요가 없으므로, 'j < N - 1 - i'만 비교하면 된다.
// for (let j = 0; j < N - 1 - i; j++) {
// if (arr[j] > arr[j + 1]) {
// swap(j, j + 1, arr);
// }
// }
// }
// return arr;
// };
// optimized solution
let bubbleSort = function (arr) {
let N = arr.length;
for (let i = 0; i < N; i++) {
// swap 횟수를 기록한다.
// 어떤 요소도 swap되지 않은 경우, 배열은 정렬된 상태이다.
let swaps = 0;
// 매 반복(iteration)마다 i번째로 큰 수가 마지막에서 i번째 위치하게 된다.
// 이미 정렬된 요소는 고려할 필요가 없으므로, 'j < N - 1 - i'만 비교하면 된다.
for (let j = 0; j < N - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
swaps++;
swap(j, j + 1, arr);
}
}
if (swaps === 0) {
break;
}
}
return arr;
};
🔑 두 변수 바꾸는 방법 3가지, 배열이 레퍼런스 타입이라 가능한 경우를 기억.
이중 반복문을 써서 전체 반복문의 탈출 조건을 만들고 그 조건에 만족할 때까지 두번째 반복문을 돌면서 계속 바꿀 요소가 있는지 확인해주는 식으로 코드를 짠 모습.