이번 글에서는 Bubble Sorting에 대해서 다뤄보고자 한다.
버블정렬의 동작원리는 다음과 같다.
배열의 0번부터 N-1번까지 탐색을 하면서 인접한 칸과 비교하여 swap을 하는 방식이다.
아래의 그림이 버블정렬의 동작 원리이다.
위의 과정이 Bubble정렬을 1회 실시하고 나서의 결과이다.
본인은 오름차순으로 정렬한 과정을 표현하였는데, j번째 값과 j+1번째 값을 비교해서 만약 j번째의 값이 더 크다면
swap을 해주는 식으로 동작하는게 버블정렬이다.
위의 과정을 첫번째는 0 ~ N -1번까지, 두 번째는 0 ~ N -2번까지, 세 번째는 0 ~ N -3번까지... 식으로 진행되는데
이유는 위의 과정을 보면 알겠지만, 1회 실시하고 나게 되면 최댓값이 가장 마지막으로 가게 된다는 것을 알 수 있다.
즉, 2번째 과정에서는 이미 최댓값 위치에 저장되어있는 가장 마지막 값을 건드릴 필요가 없는 것이다.
# 시간복잡도
- 시간복잡도를 한번 계산해보자. 처음에는 N - 1번탐색, 두 번째는 N - 2번 탐색, 세 번째는.... 이런식으로 진행되므로
총 N -1 + N - 2 + N - 3 + N - 4 + ... + 1 번을 진행하게 된다.
이를 식으로 표현하게 되면 N(N-1)/2 가 된다.
식의 유도는 하나의 예를 들어보면 쉽게 이해할 수 있다.
1, 2, 3, 4, 5 가 존재할 때, 1회 탐색할때 총 1부터 5까지 4번 탐색을 하게된다.
2회 탐색할 때에는 1부터 4까지 3번탐색, 3회는 2번, 4회는 1번... 총 4 + 3 + 2 + 1 = 10회 탐색을 하게된다.
이 10을 식을 이용해서 도출해 내면 (5 x 4) / 2로 표현할 수 있게 된다. 따라서 위의 식 만큼의 탐색을 하게 된다.
따라서 이라는 시간복잡도를 갖게 되고, 이를 빅오 표기법으로 표현하게 되면
으로 표기할 수 있다.
그렇다면 이제 최악의 경우와 최선의 경우를 한번 비교해보자.
정렬에서 최악의 경우라고 하면 역방향으로 정렬이 되어 있는 경우일 것이다.
예를 들어서 오름차순으로 정렬하려고 했는데 배열이 { 5, 4, 3, 2, 1 } 로 정렬되어 있는 경우이다.
이 때의 시간복잡도는 어떻게 될까?? 직접 계산을 해보면 알겠지만, 똑같이 이 나오게 된다.
최선의 경우는 어떻게 될까?? 최선의 경우는 아마 이미 정렬이 되어 있는 경우일 것이다.
예를 들면 오름차순으로 정렬을 하고 싶을 때 { 1, 2, 3, 4, 5 } 로 정렬되어 있는 경우이다.
이 경우에도 어차피 똑같은 탐색횟수를 가지게 된다.
즉, Bubble정렬의 경우 최악이든 최선이든 똑같이 만큼의 시간복잡도를 갖게 된다.
[ 소스코드 ]
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 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 | #include<iostream> #include<cstdlib> #include<algorithm> #include<cmath> #include<ctime> #define MAX 100 using namespace std; int Arr[MAX]; bool Flag[MAX]; void Print() { cout << "################################################################################################" << endl; int Idx = 0; for (int i = 0; i < MAX; i++) { printf("%3d ", Arr[i]); Idx++; if (Idx == 20) { Idx = 0; cout << endl; } } cout << "################################################################################################" << endl; } void Bubble_Sort() { for (int i = 0; i < MAX; i++) { for (int j = 0; j < MAX - i - 1; j++) { if (Arr[j] > Arr[j + 1]) { swap(Arr[j], Arr[j + 1]); } } } } int main(void) { srand((unsigned)time(NULL)); for (int i = 0; i < MAX; ) { Arr[i] = rand() % 300 + 1; if (Flag[Arr[i]] == false) { Flag[Arr[i]] = true; i++; } } cout << "[ Array State - Before Sorting ]" << endl; Print(); cout << endl; Bubble_Sort(); cout << "[ Array State - After Bubble Sorting ] " << endl; Print(); return 0; } | cs |
'[ Algorithm ] > # Solution - ' 카테고리의 다른 글
[ 정렬 ] 삽입 정렬 (Insertion Sort) (C++) (0) | 2019.04.28 |
---|---|
[ 정렬 ] 선택 정렬 (Selection Sort) (C++) (0) | 2019.04.28 |
[ 크루스칼 알고리즘 ] 개념과 구현방법 (C++) (8) | 2019.03.03 |
[ 순열과 조합 구현 ] 재귀를 통한 구현(4 - 중복순열) (C++) (2) | 2019.01.31 |
[ 순열과 조합 구현 ] 재귀를 통한 구현(3 - 중복조합) (C++) (2) | 2019.01.31 |