Bubble Sort는 서로 인접한 두 원소의 대소를 비교하고, 조건에 맞지 않다면 자리를 교환하며 정렬하는 알고리즘
이다.
정렬 과정이 거품이 수면으로 올라오는 듯한 모습을 보이기 때문에 Bubble라는 이름이 붙었다.
- 1회전에 첫 번째 원소와 두 번째 원소를, 두 번째 원소와 세 번째 원소를, 세 번째 원소와 네 번째 원소를, ... 이런 식으로 (마지막-1)번째 원소와 마지막 원소를 비교하여 조건에 맞지 않는다면 서로 교환한다.
- 1회전을 수행하고 나면 가장 큰 원소가 맨 뒤로 이동하므로 2회전에서는 맨 끝에 있는 원소는 정렬에서 제외되고, 2회전을 수행하고 나면 끝에서 두 번째 원소까지는 정렬에서 제외된다.
이렇게 정렬을 1회전 수행할 때마다 정렬에서 제외되는 데이터가 하나씩 늘어난다.
#include <iostream>
#include <vector>
using namespace std;
void BubbleSort(vector<int> arr){
int temp = 0;
for(int i=0; i<arr.size(); i++){ // 1
for(int j=1; j<arr.size()-i; j++){ // 2
if(arr[j-1] > arr[j]){ // 3
swap(arr[j-1], arr[j]);
}
}
}
}
- 제외될 원소의 개수를 의미한다. 1회전이 끝난 후, 배열의 마지막 위치에는 가장 큰 원소가 위치하기 때문에 하나씩 증가시켜준다.
- 원소를 비교할 인덱스를 뽑는 반복문이다. j는 현재 원소를 가리키고, j-1은 이전 원소를 가리킨다.
- 현재 가리키고 있는 두 원소의 대소를 비교한다. 오름차순으로 정렬하기 위해 현재 원소 보다 이전 원소가 더 크다면 자리를 교환한다.
(n-1) + (n-2) + (n-3) + ... + 2 + 1 ➡ n(n-1)/2
이므로 시간복잡도는 O(n^2).
정렬 여부에 상관없이 비교를 하기 때문에 최선, 평균, 최악의 경우 모두 O(n^2).
주어진 배열 안에서 교환을 통해 정렬이 수행되므로 O(n).