버블 정렬은 정렬 알고리즘 중 하나로, 인접한 두 원소를 비교하고 필요시 교환하여 배열을 정렬하는 방법이다. 이 알고리즘은 간단하고 직관적이지만, 큰 데이터셋에 대해서는 비효율적이다.
기본 버블 정렬
public class BubbleSort {
public static void sort(int[] arr) {
int n = arr.length;
for (int i = 0; i < n - 1; i++) { // n-1 회전
for (int j = 0; j < n - i - 1; j++) { // 비교할 인덱스 선택
if (arr[j] > arr[j + 1]) { // 두 원소 비교
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
}
}
System.out.print((i + 1) + "단계 : ");
print(arr);
}
}
private static void print(int[] arr) {
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {6, 2, 4, 3, 7, 1, 9};
sort(arr);
}
}
최적화된 버블 정렬
기본 버블 정렬은 이미 정렬된 배열에 대해서도 불필요한 반복을 한다. 이를 개선하기 위해 배열이 이미 정렬된 경우 루프를 일찍 종료하는 최적화된 버블 정렬을 구현할 수 있다.
public class OptimizedBubbleSort {
public static void sort(int[] arr) {
int n = arr.length;
boolean swapped;
for (int i = 0; i < n - 1; i++) {
swapped = false;
for (int j = 0; j < n - i - 1; j++) {
if (arr[j] > arr[j + 1]) {
int temp = arr[j];
arr[j] = arr[j + 1];
arr[j + 1] = temp;
swapped = true;
}
}
if (!swapped) break; // 교환이 없으면 정렬 완료
System.out.print((i + 1) + "단계 : ");
print(arr);
}
}
private static void print(int[] arr) {
for (int value : arr) {
System.out.print(value + " ");
}
System.out.println();
}
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5, 6, 7};
sort(arr);
}
}
단계별 설명
예제 배열: [6, 2, 4, 3, 7, 1, 9]
1단계:
6과 2 비교 -> 교환
6과 4 비교 -> 교환
6과 3 비교 -> 교환
6과 7 비교 -> 교환 안함
7과 1 비교 -> 교환
7과 9 비교 -> 교환 안함
결과: 2, 4, 3, 6, 1, 7, 9
2단계:
2와 4 비교 -> 교환 안함
4와 3 비교 -> 교환
4와 6 비교 -> 교환 안함
6과 1 비교 -> 교환
6과 7 비교 -> 교환 안함
결과: 2, 3, 4, 1, 6, 7, 9
3단계:
2와 3 비교 -> 교환 안함
3와 4 비교 -> 교환 안함
4와 1 비교 -> 교환
4와 6 비교 -> 교환 안함
결과: 2, 3, 1, 4, 6, 7, 9
4단계:
2와 3 비교 -> 교환 안함
3과 1 비교 -> 교환
3과 4 비교 -> 교환 안함
결과: 2, 1, 3, 4, 6, 7, 9
5단계:
2와 1 비교 -> 교환
2와 3 비교 -> 교환 안함
결과: 1, 2, 3, 4, 6, 7, 9
6단계:
1과 2 비교 -> 교환 안함
결과: 1, 2, 3, 4, 6, 7, 9
7단계:
이미 정렬 완료
결과: 1, 2, 3, 4, 6, 7, 9
버블 정렬의 시간 복잡도는 다음과 같다
버블 정렬은 주어진 배열 내에서 정렬을 수행하므로 추가적인 메모리 공간이 필요하지 않다. 따라서 공간 복잡도는 O(1)이다.
버블 정렬은 간단하고 직관적인 정렬 알고리즘으로, 인접한 두 원소를 비교하여 교환하는 방식을 사용한다. 구현이 쉬우며, 작은 데이터셋에 적합하지만, 큰 데이터셋에 대해서는 비효율적이다. 버블 정렬을 통해 기본적인 정렬 개념을 이해할 수 있으며, 다른 정렬 알고리즘과의 차이점을 파악하는 데 도움이 된다.