버블 정렬(Bubble Sort)은 배열의 처음부터 끝까지 인접한 두 숫자를 비교하며,
더 큰 숫자를 오른쪽으로 이동시키는 방식의 정렬 알고리즘입니다
실제 예시를 통해 버블 정렬의 동작방식을 살펴보겠습니다
예를 들어, [7, 5, 3, 1]
배열을 오름차순으로 정렬할 것입니다
[5, 7, 3, 1]
)[5, 3, 7, 1]
)[5, 3, 1, 7]
)첫 번째 반복을 마치면, 배열의 가장 큰 값인 7이 맨 끝에 위치하게 됩니다.
[3, 5, 1, 7]
)[3, 1, 5, 7]
)[3, 1, 5, 7]
)두 번째 반복 후 두 번째로 큰 값인 5가 끝에서 두 번째 자리에 정렬됩니다.
[1, 3, 5, 7]
)이제 모든 숫자가 오름차순으로 정렬되었습니다 ([1, 3, 5, 7]
).
위에서 설명한 동작 방식을 코드로구현하면 다음과 같습니다.
int[] arr = {3,1,5,7};
for (int i = 0; i < arr.length-1; i++) {
for (int j = 0; j < arr.length-1; j++) {
if(arr[j] > arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
}
}
}
이 코드를 실행하면 배열은 [1, 3, 5, 7]
의 형태로 오름차순 정렬됩니다
정렬 알고리즘을 사용할 때 가장 중요한 고려사항 중 하나가 바로 시간 복잡도입니다
버블 정렬은 배열의 크기(N)가 커질수록 비효율적인 알고리즘입니다.
이전에 구현한 버블 정렬 알고리즘은
이미 정렬된 배열에서도 끝까지 반복해서 확인하는 문제가 있습니다
이 문제를 해결하기 위해 다음과 같이 최적화할 수 있습니다
int[] arr = {3,1,5,7};
for (int i = 0; i < arr.length-1; i++) {
boolean isSwap = false;
for (int j = 0; j < arr.length-1; j++) {
if(arr[j] > arr[j+1]){
int tmp = arr[j];
arr[j] = arr[j+1];
arr[j+1] = tmp;
isSwap = true;
}
}
if(!isSwap){
break;
}
}
isSwap
이라는 boolean 변수를 사용하여 한 번의 순회에서 교환이 발생했는지 체크합니다
만약 교환이 한 번도 일어나지 않았다면 더 이상 반복하지 않고 종료합니다
버블 정렬은 인접한 원소의 크기를 비교하며 정렬하는 알고리즘입니다
별도의 추가 공간 없이 배열 내에서 정렬(In-place)이 가능하며,
안정 정렬이라는 장점도 있지만, 시간 복잡도가 좋지 않다는 단점도 존재합니다