정의
버블정렬은 오름차순 정렬 시 두 숫자를 비교해서 더 큰 숫자를 한번에 한칸씩 오른쪽으로 이동시키는 정렬이다.
접근
1. i 변수를 선언하여 반복문을 순회한다. 이 때, 순회 순서는 역순으로 한다.
2. j 변수를 선언하여 처음부터 i - 1 까지 순회한다.
3. 오름차순 정렬이라면 arr[j] > arr[j+1] 을 만족하면 서로의 위치를 교환한다.
코드
function bubbleSort(arr) {
for (let i = arr.length; i > 0; i--) {
for (let j = 0; j < i - 1; j++) {
if (arr[j] > arr[j+1]) {
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp;
}
}
}
return arr;
}
i 변수의 반복문을 역순으로 한 이유는 최적화 때문이다.
첫번째 순회 때 마지막 요소까지 비교해야하므로 배열의 길이까지 순회하고,
두번째 순회 때 마지막 요소는 이미 정렬된 요소이므로 해당 요소의 비교는 제외해도 된다.
이런 식으로 하나씩 정렬이 완료될 때마다 비교하는 반복문의 길이를 줄여나가면 최적화를 할 수 있다.
최적화 코드
만약 거의 정렬된 배열을 넣었을 경우에는 결과가 어떨지 확인해보자.
위 코드에 j 변수 반복문에 console을 찍어서 배열과 비교하는 두 요소를 확인해본다.
input : [8, 1, 2, 3, 4, 5, 6, 7]
1,2 / 2,3 / 3,4 / 4,5 / 5,6 / 6,7 비교해서 swap(교환)이 일어나지 않았으므로
이 다음 반복문 또한 교환이 일어나지 않는것을 알 수 있다.
이를 토대로 swap 유무에 따라 swap이 발생하지 않은 j 반복문이 존재한다면
이후의 i 반복문을 탈출하는 코드를 추가하여 코드를 최적화 할 수 있다.
function bubbleSort(arr) {
let noSwaps;
for (let i = arr.length; i > 0; i--) {
noSwaps = true;
for (let j = 0; j < i - 1; j++) {
if (arr[j] > arr[j+1]) {
let temp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = temp
noSwaps = false;
}
}
if (noSwaps) break;
}
return arr;
}
참조
'Algorithm' 카테고리의 다른 글
[Udemy] 삽입 정렬(Insertion Sort)이란? (0) | 2024.07.26 |
---|---|
[Udemy] 선택 정렬(Selection Sort)이란? (0) | 2024.07.26 |
[Udemy] 재귀 함수란 무엇인가? (0) | 2024.07.23 |
[Udemy] Sliding window 관련 문제 풀이 (2) | 2024.07.22 |
[Udemy] Sliding Window 패턴 파악하기 (0) | 2024.07.20 |