지금까지 내가 알고있기로는 버블 소트는
앞으로 다룰 정렬중에서 가장 정직하고(?) 가장 비효율적인 정렬이다.
그래서 이 정렬이 실제로 쓰이는지 궁금하기도하다.
오름차순의 경우, 거품 정렬은 뒤에 있는 데이터와 값을 비교하면서
앞의 데이터가 뒤의 데이터보다 크면 위치를 교환한다.
처음에는 주어진 배열의 처음에서 끝(N)까지 탐색,
그 뒤로는 처음부터 N-1까지 탐색, 그 뒤로는 N-2까지 탐색하며 탐색 범위를 줄여나간다.
그래서 처음 탐색을 완료하면 N번째에는 제일 큰 수가 오고
다음으로 탐색을 완료하면 N-1번째에는 그 다음으로 큰 수가 온다.
예를 들어 1, 5, 3, 2, 4 라는 배열이 있을 때
이를 거품정렬을 한다면
다음과 같을 것이다.
이 과정을 의사코드로 나타내면
for(int i = 0; i < N-1 ; i++) {
for(int j = 0; j< N-1-i; j++) {
if(arr[j] > arr[j+1]){
swap(arr[j], arr[j+1]);
}
}
}
위와 같이 나타낼 수 있다. N-1번 반복하는 과정속에서
0부터 N-1-i까지 비교하며 진행하게 된다.
C언어로 간단히 구현해보면
#include <stdio.h>
#include <string.h>
void swap(int* a, int* b){
int tmp = *a;
*a = *b;
*b = tmp;
}
//오름차순 order 1, 내림차순 order -1
void bubble_sort(int n, int order, int arr[]){
int i,j;
for(i = 0; i < n-1; ++i){
for(j = 0; j < n-1-i; ++j){
if(order*arr[j] > order*arr[j+1]){
swap(&arr[j], &arr[j+1]);
}
}
}
}
int main(void)
{
int i;
int arr[10];
for(i = 0; i < 10; ++i){
scanf("%d", arr + i);
}
bubble_sort(10, 1, arr);
for(i = 0; i < 10; ++i){
printf("%d ", arr[i]);
}
}
위와 같다.
어떤 상황에서든 N에 가까운 2번의 반복문을 거치기 때문에
거품정렬의 시간복잡도는 최선/평균/최악 모두 n^2 이다.
'컴퓨터 > 알고리즘' 카테고리의 다른 글
Insertion Sort - 삽입 정렬과 코드 (0) | 2022.07.06 |
---|---|
Select Sort - 선택 정렬과 코드 (0) | 2022.07.05 |
새내기 자료구조 멘토링 - Stack,Queue,Tree,Graph (0) | 2021.11.14 |
Sort에 사용하는 Compare 커스텀 + priority_queue 비교연산자 차이 (0) | 2021.11.09 |
깃허브를 이용한 알고리즘 스터디 하는법 (16) | 2021.10.24 |
댓글