거품정렬(Bubble Sort)
개념
Bubble Sort는 서로 인접한 두 원소의 대소를 비교하여 조건에 맞지 않다면 자리를 교환하며 정렬하는 알고리즘입니다.
로직
인접한 데이터 간에 교환이 계속일어나면서 정렬이 이루어지는 방법
- 인접한 2개의 데이터를 비교하여 크기가 순서대로 정렬되어 있지 않으면 서로 교환한다
- 교환이 이루어지지 않을 때까지 반복한다.
1회전을 수행하고 나면 가장 큰 자료가 맨 뒤로 이동하는 특징이 있다.
코드
BubbleSort.java
아래 작성된 코드는 개선된 버전의 Bubble Sort이다.
1회전을 수행하고 나면 가장 큰 자료가 맨 뒤로 이동하는 특징이 있기 때문에 탐색하는 범위를 줄였으며
버블정렬의 각 단계에서 데이터의 교환이 일어나지 않으면 정렬이 끝난 것을 의미하므로 다음단계를 실행하지 않고 정렬을 종료할 수 있다.
package Algorithm;
import java.util.Arrays;
import java.util.Random;
public class BubbleSort {
static final int N = 10;
public static void main(String[] args) {
Random random = new Random(); // 랜덤함수를 이용
int[] arr = new int[N];
for (int i = 0; i < N; i++) {
arr[i] = random.nextInt(100); // 0 ~ 99
}
System.out.println("정렬 전: " + Arrays.toString(arr));
bubbleSort(arr);
System.out.println("정렬 후: " + Arrays.toString(arr));
}
private static void bubbleSort(int[] arr) {
boolean flag = true;
int temp;
for (int n = arr.length - 1; n > 0 && flag; n--) {
flag = false;
for (int i = 0; i < n; i++) {
if (arr[i] > arr[i + 1]) {
swap(arr, i, i + 1);
flag = true;
}
}
}
}
private static void swap(int[] arr, int a, int b) {
int temp = arr[a];
arr[a] = arr[b];
arr[b] = temp;
}
}
console
정렬 전: [75, 28, 51, 92, 75, 15, 45, 97, 70, 79]
정렬 후: [15, 28, 45, 51, 70, 75, 75, 79, 92, 97]
시간복잡도
비교 횟수
주어진 데이터의 개수가 $n$개 일때
$$
\sum_{i=1}^{n-1}n-i=(n-1)+(n-2)+(n-3)+...+1=\frac{n(n-1)}{2}
$$
번의 비교를 하게 된다.
최선, 최악, 평균 모두 $O(N^2)$의 동일한 시간복잡도를 갖습니다.
교환 횟수
최악의 경우 원소를 비교할때마다 자리 교환이 일어나므로 최대 ${n(n-1)\over2}$번의 교환이 발생합니다.
장점
- 알고리즘이 단순하여 구현이 쉽다.
- 추가적인 메모리 공간이 필요하지 않다.
- 안정 정렬이다.
단점
- 시간복잡도가 $O(N^2)$으로 비효율적이다.
- 정렬 되어있지 않은 원소를 정렬하기 위해 교환(swap)이 많이 일어난다.
- 같은 시간복잡도 Selection Sort는 1번의 교환으로 정렬이 가능하다.
'Algorithm' 카테고리의 다른 글
선택정렬(Selection Sort) (0) | 2020.07.19 |
---|---|
삽입정렬(Insertion Sort) (0) | 2020.07.19 |
[Algorithm] 최소신장트리(MST) (0) | 2019.11.10 |
[Algorithm] 최소신장트리(MST) - Kruskal (0) | 2019.11.10 |
[Algorithm] 최소신장트리(MST) - Prim (0) | 2019.11.10 |