본문 바로가기
Algorithm

[정렬] 버블 정렬 (Bubble Sort)

by Ladun 2019. 11. 21.

소개

  • 서로 인접한 두 원소를 검사하여 정렬하는 알고리즘이다.
  • 다른 정렬 알고리즘에 비해 느린 편이지만, 코드가 간단하다.

정렬 과정


첫 번째 탐색

1. 5 3을 비교 

2. 앞에 있는 5 더 크므로 5 3의 위치를 바꾼다.

3. 5 1을 비교

4. 앞에 있는 5 더 크므로 5 1의 위치를 바꾼다.

5. 5 9를 비교

6. 뒤에 있는 9 더 크므로 위치를 변경하지 않는다.

7. 9 7을 비교

8. 앞에 있는 9 더 크므로 9 7의 위치를 바꾼다.

9. 첫 번째 순회가 끝난 배열


첫 번째 탐색의 과정을 보면 가장 큰 수가 맨 뒤로 이동하게 된다. 

즉, 매 순회마다 정렬된 수를 제외한 가장 큰 수가 맨 뒤로 가 뒤에서부터 정렬이 된다.

그러므로 맨 순회마다 배열의 전체를 탐색할 필요 없이 정렬된 부분을 제외한 부분만 탐색하면 된다.

 

더보기

 

두 번째 탐색 결과

세 번째 탐색 결과

네 번째 탐색 결과

다섯 번째 탐색 결과


코드 구현

#include <stdio.h>

void PrintArray(int* arr, int size)
{
	for (int i = 0; i < size; i++)
	{
		printf("%d ", arr[i]);
	}
	printf("\n");
}

void BubbleSort(int* arr, int size)
{

	int tmp;
	for (int i = 0; i < size ; i++)
	{
		for (int j = 0; j < size - (1 + i); j++)
		{
			if (arr[j] > arr[j + 1])
			{
				tmp = arr[j];
				arr[j] = arr[j + 1];
				arr[j + 1] = tmp;
			}
		}
		printf("%d번째 순회: ", i + 1);
		PrintArray(arr, size);
	}
}
int main(void)
{
	int arr[5] = { 5 , 3, 1, 9, 7 };

	printf("정렬 전: ");
	PrintArray(arr, 5);

	BubbleSort(arr, 5);

	printf("정렬 후: ");
	PrintArray(arr, 5);

	return 0;

}
더보기

정렬 전: 5 3 1 9 7
1번째 순회: 3 1 5 7 9
2번째 순회: 1 3 5 7 9
3번째 순회: 1 3 5 7 9
4번째 순회: 1 3 5 7 9
5번째 순회: 1 3 5 7 9
정렬 후: 1 3 5 7 9

정리

  • 시간 복잡도: (n - 1) + (n - 2) + ...... + 1 = n(n-1)/2 = O(n^2)
  • 코드가 간결하며 이해하기 쉽지만, 시간 복잡도가 O(n^2)인 만큼 데이터의 양이 많을수록 성능이 저하된다.
  • 뒤에서부터 정렬이 된다는 특징이 있다.

 

 

'Algorithm' 카테고리의 다른 글

Lower Bound & Upper Bound  (0) 2020.04.03
이분 탐색(Binary Search)  (0) 2020.04.03
[정렬] 선택 정렬 (Selection Sort)  (0) 2020.01.20
[정렬] 삽입 정렬 (Insertion Sort)  (0) 2020.01.20
에라토스테네스의 체(Eratosthenes' sieve)  (0) 2019.03.17