시간복잡도를 계산하면, (n-1) + (n-2) + (n-3) + .... + 2 + 1 => n(n-1)/2이므로, O(n^2) 이다. 또한, Bubble Sort는 정렬이 돼있던 안돼있던, 2개의 원소를 비교하기 때문에 최선, 평균, 최악의 경우 모두 시간복잡도가 O(n^2)
으로 동일하다.
주어진 배열 안에서 교환(swap)을 통해, 정렬이 수행되므로 O(n)
이다.
function solution(arr) {
let answer = arr;
for ( let i = 0; i < arr.length - 1; i++ ) {
for ( let j = 0; j < arr.length - i - 1; j++) {
if (arr[j] > arr[j+1]) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
}
}
}
return answer;
}
let arr = [13, 5, 11, 7, 23, 15];
console.log(solution(arr));
구현이 매우 간단하고, 소스코드가 직관적이다.
정렬하고자 하는 배열 안에서 교환하는 방식이므로, 다른 메모리 공간을 필요로 하지 않다. => 제자리 정렬(in-place sorting)
안정 정렬(Stable Sort) 이다.
시간복잡도가 최악, 최선, 평균 모두 O(n^2)으로, 굉장히 비효율적이다.
정렬 돼있지 않은 원소가 정렬 됐을때의 자리로 가기 위해서, 교환 연산(swap)이 많이 일어나게 된다.
정렬 알고리즘 중에 가장 직관적인 Bubble Sort에 대해 알아봤다. 기술 면접에서도 종종 나오는 정렬 알고리즘으로 알아두면 좋다.
function solution(arr) {
let answer = arr;
for ( let i = 0; i < arr.length - 1; i++ ) {
for ( let j = 0; j < arr.length - i - 1; j++) {
if ( arr[j] > 0 && arr[j+1] < 0) {
[arr[j], arr[j+1]] = [arr[j+1], arr[j]];
}
}
}
return answer;
}
let arr=[1, 2, 3, -3, -2, 5, 6, -6];
console.log(solution(arr));