-
반응형
0. 목차
1.버블정렬의 개념
버블정렬은 거품이 위로 올라가는것과 유사하다는 의미에서 버블정렬이라는 이름이 붙여졌다.
버블정렬은 인접한 두 데이터를 비교해가며, 조건을 만족하면 SWAP을 하며 정렬하는 방식이다.
말로는 어려울테니 아래의 그림을 보며 이해해보자.
5 1 4 7 2 의 데이터를 버블정렬을 이용하여 오름차순으로 정렬하는 과정을 보여준다.
1. 5와 1을 비교했을 때, 5>1 이므로 교환
2. 5와 4를 비교했을 때, 5>4 이므로 교환
3. 5와 7을 비교했을 때, 5<7 이므로 교환 X
4. 7과 2를 비교했을 때, 7>2 이므로 교환
=>이렇게 1페이즈에서 정렬되지않은 데이터중 가장 큰 수인 7이 맨 위(맨 뒤) 로 떠올랐다.
그럼 다음으로 정렬되지않은 데이터중에서 가장큰 수를 거품처럼 올려보자
1. 1과 4를 비교했을 때, 1<4 이므로 교환 X
2. 4와 5를 비교했을 때, 4<5 이므로 교환 X
3. 5와 2를 비교했을 때, 5>2 이므로 교환
=>2페이즈에선 정렬되지 않은 데이터중 가장 큰 수인 5가 떠올랐다.
다음 페이즈도 마찬가지로 해준다.
1. 1과 4를 비교했을 때, 1<4 이므로 교환 X
2. 4와 2를 비교했을 때, 4>2 이므로 교환
=>정렬되지 않은 데이터중 가장 큰 수 인 4가 맨 위로 떠올랐다.
마지막 페이즈를 실행시켜준다.
1. 1과 2를 비교했을 때, 1<2 이므로 교환 X
=> 정렬되지않은 데이터중 가장 큰 수인 2가 떠올랐다.
마지막은 할 필요가 없이 데이터가 1개가 남았으므로, 비교대상이 없다. 이 의미는 뒤에가 정렬이 완료되었으니, 남은 데이터 하나는 당연히 정렬이 된 상태가 된다.
2.버블정렬 과정 정리
- 정렬되지않은 데이터중, 맨 앞의 위치를 선정한다.
- 정렬되지않은 데이터와 그 뒤의 데이터(정렬되지 않은 데이터)를 비교하여, 조건에 부합하다면 SWAP을 해준다.
- 2번을 수행하며 정렬되지않은 데이터의 맨 끝까지 왔으면, 비교할것이 없으므로 1번으로 되돌아간다.
3.버블정렬 시간복잡도
N개의 데이터를 정렬한다고 한다면,
버블을 올려주는 행동의 시간복잡도는 정렬되지않은 데이터들을 모두 탐색해야하므로 O(N)이 된다.
이 버블을 올려주는 행동을 N-1번 해야하므로
버블정렬의 시간복잡도는 총 O(N2)이 된다.
4.버블정렬 코드
#include<iostream> using namespace std; int main() { int arr[5] = { 5,1,4,7,2 }; int size = 5; int temp; cout << "정렬 전 :\t"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << "\n"; for (int i = 0; i < size - 1; i++) { for (int j = 0; j < size - i - 1; j++) { if (arr[j] > arr[j + 1]) { temp = arr[j]; arr[j] = arr[j + 1]; arr[j + 1] = temp; } } //중간결과 cout << i + 1 << "번째 결과 :\t"; for (int j = 0; j < 5; j++) { cout << arr[j] << " "; } cout << "\n"; } cout << "정렬 결과:\t"; for (int i = 0; i < 5; i++) { cout << arr[i] << " "; } cout << "\n"; return 0; }
반응형'알고리즘' 카테고리의 다른 글
[알고리즘] 최소공배수와 최대공약수 C++ (0) 2021.08.12 [알고리즘] 소수판별 알고리즘 C++ (0) 2021.08.11 [알고리즘] 퀵정렬 (Quick Sort) C++ (0) 2021.07.12 [알고리즘] 삽입정렬 (Insertion Sort) C++ (0) 2021.05.05 [알고리즘] 선택정렬 (Selection Sort) C++ (0) 2021.05.03 댓글