[Data Structure] C++로 구현한 버블 정렬

Bubble Sort

#include <iostream>

void bubbleSort(int arr[]) {
	int n = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < n - 1; i++) {
		for (int j = 0; j < n - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
	}
}

int main() {
	int arr[] = { 64,25,12 };

	bubbleSort(arr);

	int len = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < len; i++) {
		std::cout << arr[i] << std::endl;
	}
	return 0;
}

설명

첫번째 for문의 한 사이클이 끝날때 가장 우측의 값은 큰값을 가지고 확정된다. (모든 수를 비교하기 때문에) 따라서 두번째 사이클 에는 우측의 한자리를 제외하고 정렬을 진행한다.

그렇기에 두번쨰 for문의 조건에 -i이 사용되는 것이다.

두번쨰 사이클엔 - 1 (우측숫자 1개 제외)
세번쨰는 -2 (우측숫자 2개 제외)
...

추가 최적화

swap이 일어나지 않으면 미리 함수를 종료하도록 최적화를 더 할 수 있다.

void bubbleSort(int arr[]) {
	int n = sizeof(arr) / sizeof(arr[0]);
	for (int i = 0; i < n - 1; i++) {
		bool swapped = false; // bool 체크 변수 추가
		for (int j = 0; j < n - i - 1; j++) {
			if (arr[j] > arr[j + 1]) {
				int tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
				swapped = true;
			}
		}
		if (swapped == false) {
			return;
		}
	}
}

시간 복잡도

  • 최악의 경우: 이중 반복문을 전부 순찰하니.. O(n^2)