서로 인접한 두 원소를 검사하여 정렬하는 알고리즘으로 크기를 비교하여 순서대로 되어 있지 않으면 서로 교환하는 방식을 가진다.
사실 버블 정렬에는 코드내에서 개선 가능한 부분이 있다.
1번의 경우 간단해 보이는데 2번의 경우 헷갈릴 수 있을 것 같으니 코드를 올려두도록 하겠습니다.
void bubbleSortUpgrade(int[] a, int n) {
int k = 0;
while (k < n - 1) {
int last = n - 1;
for(int j = n - 1; j > k; j--)
if(a[j] < a[j - 1]){
swap(a, j - 1, j);
last = j;
}
// 반복문이 끝났을 때 최종적으로 지점까지만 수행
// 바뀌지 않은 앞의 Index는 이미 오름차순
k = last;
}
}
- 구현이 매우 간단하다.
- 순서에 맞지 않은 요소를 인접한 요소와 교환한다.
- 하나의 요소가 가장 왼쪽에서 가장 오른쪽으로 이동하기 위해서는 배열에서 모든 다른 요소들과 교환이 되어야 한다.
- 특히 특정 요소가 최종 정렬 위치에 있는 경우라도 교환되는 일이 일어난다.
비교 횟수를 봤을 때 n - 1회, n - 2회, … 이와 같은 방식으로 이루지므로 합계는 다음과 같다.
(n-1) + (n-2) + ... + 1 = n(n-1)/2
좀 더 정확히 구해보자면, 실제 요소를 교환하는 횟수는 배열의 요솟값에 더 많이 영향을 받기 때문에 교환 횟수의 평균값은 비교 횟수의 절반인 n(n-1) / 4 회입니다. 또한, swap 메소드 안에서 값의 이동이 3회 발생하므로 이동 횟수의 평균은 3n(n-1) / 4회 입니다.
Reference