Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 | 6 | |
| 7 | 8 | 9 | 10 | 11 | 12 | 13 |
| 14 | 15 | 16 | 17 | 18 | 19 | 20 |
| 21 | 22 | 23 | 24 | 25 | 26 | 27 |
| 28 | 29 | 30 | 31 |
Tags
- Gemini
- Java
- INSERT SELECT
- GoogleCloudConsole
- join
- 백준
- 프로그래머스
- dangerouslySetInnerHTML
- react
- 자바의 정석
- 유데미
- databse
- 스터디윗미
- Error Handling
- 조건문
- 파이썬
- til
- mysql
- 회고
- MVMM
- RESIGNAL
- javascript
- 개념
- 자바
- Google Cloud Skills Boost
- 스레드
- 유데미코리아
- AI
- sql
- 알고리즘
Archives
- Today
- Total
휘적이는 기록공간
거품*버블 정렬(Bubble Sort) 본문
버블 정렬 또는 거품 정렬이라고 부른다.
모든 인접한 두 데이터를 차례대로 비교해서
왼쪽 데이터가 더 큰 경우에는 오른쪽 데이터와 자리를 바꾸는 과정을 반복해서 정렬을 수행하는 방식

비교를 진행하는 방향
- 왼쪽에서 오른쪽으로 진행
- 가장 큰 값을 찾아서 오른쪽 끝에 위치시킴
- 오른쪽에서 왼쪽으로 진행
- 가장 작은 값을 찾아 왼쪽 끝에 위치시킴
버블 정렬 식
BubbleSort(A[], n)
{
for(i=0; i<n-1; i++) // 단계: (n-1)번 반복
for(j=0; j<n-1; j++) // 왼쪽에서 오른쪽으로 진행하는 경우
if(A[j] > A[j+1]) // '왼쪽 데이터 > 오른쪽 데이터'일 경우
A[j]와 A[j+1]의 자리 바꿈;
return (A);
}
버블 정렬 예시(진행 방향이 왼쪽에서 오른쪽인 경우)

버블 정렬의 성능
for(i=0; i<n-1; i++) // 단계: (n-1)번 반복
for(j=0; j<n-1; j++) // 왼쪽에서 오른쪽으로 진행하는 경우
for문은 0, ..., (n-2)
-> (n-1) 회
총 두 번의 for문이 있기에 성능은 O(n²)이 된다.
버블 정렬의 특징
- 안정적인 정렬 알고리즘
- 인접한 두 데이터가 동일한 경우 위치 교환이 발생하지 않음
- 제자리 정렬 알고리즘
- 입력 배열 A[] 외 상수 개의 저장 공간만 필요
- 선택 정렬에 비해 데이터 교환이 많이 발생
개선된 버블 정렬
버블 정렬의 성능은 반복문의 조건에서 발생한다.
for(i=0; i<n-1; i++) // 단계: (n-1)번 반복
for(j=0; j<n-1; j++) // 왼쪽에서 오른쪽으로 진행하는 경우
첫 번째 for문은 처리 단계의 수를 나타낸다.
자리 바꿈이 발생하지 않으면 이미 정렬된 상태이므로 이후의 처리 단계를 수행하지 않고 종료시켜야한다.
두 번째 for문은 인접한 두 데이터의 비교 횟수를 나타낸다.
각 단계에서 무조건 오른쪽 끝까지 이동하면서 인접한 두 데이터 비교는 불필요하다.
이때 이미 제자리를 잡은 데이터에 대해서는 비교를 수행하지 않도록 해야 한다.
개선된 버블 정렬 식
Advanced_BubbleSort(A[], n)
{
for(i=0; i<n-1; i++){ // 단계: 0, 1, ..., (n-2)
Sorted = TRUE; // 이미 정렬된 상태라고 가정
for(j=0; j<(n-1)-i; j++) // 왼쪽에서 오른쪽으로 진행하는 경우
if(A[j] > A[j+1]){
A[j]와 A[j+1]의 자리바꿈;
Sorted = FALSE; // 자리바꿈 발생 -> 미정렬 상태
}
if(Sorted == TRUE) break; // 이미 정렬된 상태이므로 종료
} return (A);
}
개선된 버블 정렬 성능과 특징
개선된 버블정렬의 성능은 이전과 동일하게 O(n²)이다.
차이점은 입력 데이터의 상태에 따라 성능이 다르다는 것이다.


'Tech Notes & Growth > Algorithm & Problem Solving' 카테고리의 다른 글
| [java] 프로그래머스 지폐 접기 (9) | 2025.06.09 |
|---|---|
| [java] 프로그래머스 문자열 다루기 기본 (0) | 2025.03.30 |
| [java] 백준 문제 2739, 구구단 (부제: 코드 길이가 길어도 반드시 성능이 떨어지지 않으며, 짧다고 해서 좋은 성능을 보장하는 것도 아니다) (1) | 2025.03.30 |
| [java] 프로그래머스 핸드폰 번호 가리기 (1) | 2025.03.27 |
| [nodejs] 백준 10171번 고양이 (0) | 2021.12.06 |