버블 정렬은 정렬 알고리즘 중 하나로, 인접한 두 원소를 비교하여 조건이 맞지 않다면 두 원소를 교환하는 동작을 순차적으로 반복하여 오른쪽부터 차례대로 원소들이 정렬되게 하는 정렬 알고리즘이다.
출처 : https://github.com/GimunLee/tech-refrigerator/blob/master/Algorithm/resources/bubble-sort-001.gif
위의 그림처럼 버블 정렬 시 정렬된 원소의 부분 집합과 아직 정렬되지 않은 원소의 부분 집합으로 나뉜다. 버블되어 올라간 원소들이 차례대로 오른쪽으로 옮겨져 정렬된 부분 집합을 이룬다. 정렬되지 않은 부분 집합들의 원소들에 대하여 설명한 동작을 전체 원소가 정렬될 때까지 반복한다.
// 구현부
void BubbleSort(int* arr, int size)
{
for (int i = size - 1; i >= 1; --i)
{
// 교환이 일어나는지 체크
bool Swapped = false;
for (int j = 0; j < i; ++j)
{
if (arr[j] > arr[j + 1])
{
std::swap(arr[j], arr[j + 1]);
Swapped = true;
}
}
// 교환이 일어나지 않았다면 모두 정렬됐다는 뜻이므로 break
if (!Swapped) break;
}
}
// 실행부
int main()
{
int arr[]{ 5, 4, 3, 2, 1 };
int size = sizeof(arr) / sizeof(arr[0]);
BubbleSort(arr, size);
for (const auto& ele : arr)
{
std::cout << ele << " ";
}
// 출력 : 1 2 3 4 5
}
최선 :
배열이 이미 정렬된 상태면 한 번만 순회하면 되기 때문에 최선일 때의 시간 복잡도는 이다.
평균, 최악 :
인접한 두 원소를 비교하고 교환하는 횟수가 총 이고, 배열이 역순인 최악의 상황일 때도 마찬가지이므로 시간 복잡도는 이다.
버블 정렬은 추가적인 배열이나 메모리를 사용하지 않고 배열 내에서 원소의 교환이 이루어지기 때문에 공간 복잡도는 이다.