버블 정렬이란, 정렬되지 않은 데이터들 중 인접한 두 데이터를 비교해 자리를 교환해나가는 정렬 방식이다.
(처음 기준 위치는 0번 인덱스를 가르킨다.)
출처: algorithmcanvas
기준 위치와 다음 위치를 비교하여 기준 위치가 더 큰 값이라면
다음 위치로 변경한다.
(만약, 다음 위치가 더 크다면 pass)
초기 배열:
[ 38, 5, 57, 21, 12 ]
| 단계 | 배열 상태 | 비교 요소 | 교환 여부 | 결과 배열 상태 |
|---|---|---|---|---|
| 1단계 | [ 38, 5, 57, 21, 12 ] | (38, 5) | 교환 O | [ 5, 38, 57, 21, 12 ] |
| 2단계 | [ 5, 38, 57, 21, 12 ] | (38, 57) | 교환 X | [ 5, 38, 57, 21, 12 ] |
| 3단계 | [ 5, 38, 57, 21, 12 ] | (57, 21) | 교환 O | [ 5, 38, 21, 57, 12 ] |
| 4단계 | [ 5, 38, 21, 57, 12 ] | (57, 12) | 교환 O | [ 5, 38, 21, 12, 57 ] |
결과:
1회 정렬 후 가장 큰 원소 57이 맨 뒤로 이동.
[ 5, 38, 21, 12, 57 ]
1회 정렬의 결과로 57이 마지막 인덱스에 위치했으므로 이를 제외한 나머지 원소들만 정렬 진행.
| 단계 | 배열 상태 | 비교 요소 | 교환 여부 | 결과 배열 상태 |
|---|---|---|---|---|
| 1단계 | [ 5, 38, 21, 12, 57 ] | (5, 38) | 교환 X | [ 5, 38, 21, 12, 57 ] |
| 2단계 | [ 5, 38, 21, 12, 57 ] | (38, 21) | 교환 O | [ 5, 21, 38, 12, 57 ] |
| 3단계 | [ 5, 21, 38, 12, 57 ] | (38, 12) | 교환 O | [ 5, 21, 12, 38, 57 ] |
결과:
2회 정렬 후 비교 범위 중 가장 큰 원소 38이 해당 범위의 마지막 인덱스로 이동.
[ 5, 21, 12, 38, 57 ]
2회 정렬의 결과로 38, 57이 마지막 인덱스에 위치했으므로 이를 제외한 나머지 원소들만 정렬 진행.
| 단계 | 배열 상태 | 비교 요소 | 교환 여부 | 결과 배열 상태 |
|---|---|---|---|---|
| 1단계 | [ 5, 21, 12, 38, 57 ] | (5, 21) | 교환 X | [ 5, 21, 12, 38, 57 ] |
| 2단계 | [ 5, 21, 12, 38, 57 ] | (21, 12) | 교환 O | [ 5, 12, 21, 38, 57 ] |
결과:
3회 정렬 후 비교 범위 중 가장 큰 원소 21이 해당 범위의 마지막 인덱스로 이동.
[ 5, 12, 21, 38, 57 ]
3회 정렬의 결과로 21, 38, 57이 마지막 인덱스에 위치했으므로 이를 제외한 나머지 원소들만 정렬 진행.
| 단계 | 배열 상태 | 비교 요소 | 교환 여부 | 결과 배열 상태 |
|---|---|---|---|---|
| 1단계 | [ 5, 12, 21, 38, 57 ] | (5, 12) | 교환 X | [ 5, 12, 21, 38, 57 ] |
결과:
4회 정렬 후 비교 범위 중 가장 큰 원소 12가 해당 범위의 마지막 인덱스로 이동.
[ 5, 12, 21, 38, 57 ]
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
/**
* [입력 데이터]
* 1. 원소 개수
* 2. 원소
*
* 5
* 12 5 38 21 57
*/
public class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringBuilder sb = new StringBuilder();
static StringTokenizer st;
static int N;
static int[] bubbleSort;
public static void main(String[] args) throws IOException {
init();
// 마지막 원소는 자동 정렬되므로 n-1 반복
for (int compareCount = 0; compareCount < N - 1; compareCount++) {
/** [N - compareCount 이유]
* 마지막 인덱스 부터 각 회전 횟수만큼 큰 값이 들어오므로 끝까지 비교할 필요가 없다.
*
* [ N - compareCount - 1 이유]
* 언제나 idx + 1 과 비교하기 때문에 고정적으로 마지막 자리는 비교할 필요가 없다.
*/
for (int idx = 0; idx < N - compareCount - 1; idx++) {
if (bubbleSort[idx] > bubbleSort[idx + 1]) {
int tmp = bubbleSort[idx];
bubbleSort[idx] = bubbleSort[idx + 1];
bubbleSort[idx + 1] = tmp;
}
}
}
for (int idx = 0; idx < N; idx++) {
sb.append(bubbleSort[idx]).append(" ");
}
System.out.println(sb);
}
public static void init() throws IOException {
N = Integer.parseInt(br.readLine().trim());
st = new StringTokenizer(br.readLine().trim());
bubbleSort = new int[N];
for (int idx = 0; idx < N; idx++) {
bubbleSort[idx] = Integer.parseInt(st.nextToken());
}
}
}
버블 정렬과 선택 정렬은 모두 평균 및 최악의 경우 시간복잡도가 O(N²) 로 동일하지만, 동작 방식에서 차이가 있습니다.
버블 정렬
선택 정렬
버블 정렬
선택 정렬
버블 정렬
선택 정렬
두 정렬 모두 단순하지만 비효율적인 정렬 방식이므로, 대규모 데이터에서는 퀵 정렬이나 병합 정렬 같은 고급 알고리즘을 사용하는 것이 더 적합합니다.