버블 정렬은 인접한 두 개의 요소를 비교하고 필요에 따라 서로 위치를 교환하는 방식으로 동작합니다.
버블 정렬은 간단하고 구현하기 쉽지만, 최악의 경우(평균의 경우에도) 에는 시간 복잡도가 O(n^2)이 되어 효율적이지 않습니다. O(n^2)이기 때문에 배열의 크기가 커질수록 성능이 저하됩니다.
데이터: [5, 3, 8, 4, 2]
정렬 과정:
1회전: [3, 5, 4, 2, 8]
2회전: [3, 4, 2, 5, 8]
3회전: [3, 2, 4, 5, 8]
4회전: [2, 3, 4, 5, 8]
//1회전 할떄마다 큰 값들부터 정렬이 된다.
최종 정렬된 배열: [2, 3, 4, 5, 8]
function bubbleSort(arr) {
const length = arr.length;
for (let i = 0; i < length - 1; i++) {
for (let j = 0; j < length - 1 - i; j++) {
if (arr[j] > arr[j + 1]) {
// 두 요소의 위치 교환
[arr[j], arr[j + 1]] = [arr[j + 1], arr[j]];
}
}
}
return arr;
}
삽입 정렬은 배열을 정렬된 부분과 정렬되지 않은 부분으로 나누고, 정렬되지 않은 요소를 정렬된 부분에 삽입하는 방식으로 동작합니다.
버블정렬과 동일하다.
데이터: [5, 3, 8, 4, 2]
정렬 과정:
1회전: [3, 5, 8, 4, 2]
2회전: [3, 5, 8, 4, 2]
3회전: [3, 4, 5, 8, 2]
4회전: [2, 3, 4, 5, 8]
최종 정렬된 배열: [2, 3, 4, 5, 8]
function insertionSort(arr) {
const length = arr.length;
//두번째 요소 부터 시작!
for (let i = 1; i < length; i++) {
const key = arr[i];
let j = i - 1;
//만약 시작에 도달했거나 더 작은 값을 만나면 stop
while (j >= 0 && arr[j] > key) {
arr[j + 1] = arr[j];
j--;
}
arr[j + 1] = key;
}
return arr;
}
삽입 정렬과 버블 정렬의 시간 복잡도가 O(n^2)인 이유는 각각의 알고리즘에서 반복문의 횟수가 배열의 크기에 비례하여 증가하기 때문입니다.
두 알고리즘은 간단하고 구현하기 쉽지만, 배열의 크기가 커질수록 효율성이 저하되는 단점을 가지고 있습니다. 따라서 더 효율적인 정렬 알고리즘들이 개발되었으며, 대규모 데이터를 정렬할 때는 다른 알고리즘들을 고려하는 것이 좋습니다.
https://prodo-developer.tistory.com/110
https://visualgo.net/en/sorting