이번 시간에 다뤄볼 알고리즘은 저번 시간에 이어 기본 정렬 알고리즘인 Bubble Sort 입니다.
Bubble Sort는 Selection Sort와 함께 가장 기본적인 정렬 알고리즘에 속합니다.
Bubble Sort의 동작 과정
1. 첫번째 수 부터 N-1 번째 수 까지 가면서 해당 수와 바로 다음 수를 비교한다.
2. 해당 수 보다 바로 다음 수가 더 작다면, 둘의 자리를 바꿔 큰 수가 뒤에 오도록 한다.
3. N번째 수에 도달하게 되면 그 자리에는 가장 큰 수가 오게된다.
4. 1~3 과정을 N-2번째 수 까지, N-3번째 수까지 ... ... 첫번째 수 까지 하게되면 모든 수가 오름차순으로 정렬된다.
1, 2, 3번과정을 수행하면 다음과 같이 진행됩니다.

여기서 초록색 부분은 현재까지 정렬된 구간입니다.
첫번째 수 부터 진행하여 다섯번째 수에 도달하게 되면 그 자리에는 가장 큰 수 7 이 오게 됨을 알 수 있습니다.
다섯번째 수 까지는 정렬된 구간이니, 네번째 수 까지 1, 2, 3 과정을 진행해보면

이렇게 7을 제외한 가장 큰 수 5까지 정렬된 구간이 됩니다.

더 진행하면 4, 5, 7 까지 정렬되고

마침내 모든 수가 오름차순으로 정렬됩니다.
이 알고리즘의 시간복잡도는 Selection Sort 와 마찬가지로 \( O(n^{2}) \) 입니다.
\( n \)개의 수가 있다면, \( n-1 + n-2 + ... ...+ 1 \) 번 비교를 해야하기 때문입니다.
공간복잡도 또한 Selection Sort와 마찬가지로 \( O(n) \) 입니다.
2750번: 수 정렬하기
첫째 줄에 수의 개수 N(1 ≤ N ≤ 1,000)이 주어진다. 둘째 줄부터 N개의 줄에는 숫자가 주어진다. 이 수는 절댓값이 1,000보다 작거나 같은 정수이다. 수는 중복되지 않는다.
www.acmicpc.net
마찬가지로 위 문제를 해결할 수 있습니다.
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 32 33 | #include <bits/stdc++.h> using namespace std; int numbers[1001]; int main() { int n; scanf("%d", &n); for(int i=0;i<n;i++) scanf("%d", &numbers[i]); for(int i=0;i<n;i++) { // n-i 번째 수 까지 비교한다. for(int j=0;j<n-i-1;j++) { // 지금 보고 있는 수가 다음 수 보다 크면 자리 바꾸기 if(numbers[j] > numbers[j+1]) { // swap int tmp = numbers[j]; numbers[j] = numbers[j+1]; numbers[j+1] = tmp; } } } for(int i=0;i<n;i++) printf("%d\n", numbers[i]); return 0; } | cs |
'Problem Solving > COALA 튜터링' 카테고리의 다른 글
| 3. (1) C++ STL (Standard Template Library) (0) | 2021.05.19 |
|---|---|
| 2. 재귀 함수 (0) | 2021.05.03 |
| 1.-(1) 기본 정렬 알고리즘 - Selection Sort(선택정렬) (0) | 2021.05.03 |
| 0. Intro (0) | 2021.05.03 |