개발 초보 2022. 6. 7. 18:31

지난 글: [알고리즘] - 정렬이란?

 

버블 정렬(bubble sort)에서는 '오른쪽부터 왼쪽 방향으로 인접한 두 개의 숫자를 비교해서 교환'하는 작업을 반복한다. 오른쪽부터 왼쪽으로 숫자를 옮겨가는 모양이 물속에서 거품이 올라오는 모양과 비슷하다고 해 버블이라고 한다고 한다.

 

1

5	9	3	1	2	8	4	7	6 // 이 경우 7과 6을 비교
							---------

수열의 오른쪽 끝에 저울을 두고 저울의 좌우에 있는 숫자를 비교한다. 비교한 결과, 오른쪽 숫자가 작으면 왼쪽과 바꾼다. 6 < 7 이므로 좌우의 숫자를 교체한다.

5	9	3	1	2	8	4	6	7
							---------

 

2

비교를 완료했으면 저울을 한 칸 왼쪽으로 옮겨서 같은 방법으로 숫자를 비교한다.

5	9	3	1	2	8	4	6	7
						---------

이번에는 4 < 6 이므로 숫자를 교체하지 않는다.

 

3

저울을 한 칸 왼쪽으로 옮긴다. 같은 작업을 저울이 왼쪽 끝에 도착할 때까지 반복한다.

5	9	3	1	2	8	4	6	7
					---------

8 > 4 이므로 숫자를 교체.

5	9	3	1	2	4	8	6	7
					---------

 

4

1	5	9	3	2	4	8	6	7
---------

숫자 교체를 반복하면서 저울이 왼쪽 끝에 도착했다. 일련의 작업으로 수열 중에서 가장 작은 숫자가 왼쪽 끝으로 이동했다.

 

5

왼쪽 끝의 숫자는 정렬을 끝낸 것으로 간주하고, 저울을 다시 오른쪽 끝으로 옮긴다. 저울이 왼쪽 끝에서 두 번째에 도착할 때까지 앞의 작업을 반복한다.

1	5	9	3	2	4	8	6	7
							---------

6 < 7 이므로 교체 X

 

6

저울이 왼쪽 끝에서 두 번째에 도착했다. 수열 중에서 두 번째로 작은 숫자가 두 번째 위치로 이동됐다.

1	2	5	9	3	4	6	8	7
	---------

 

7

저울을 다시 오른쪽 끝으로 옮긴다. 같은 방법으로 모든 숫자가 정렬될 때까지 반복한다.

1	2	3	4	5	6	7	8	9
							---------

정렬이 완료되었다.

 

버블 소트는 1라운드에서 n-1회, 2라운드에서 n-2회, .... n-1라운드에서 1회를 비교한다. 이 때문에 비교 횟수는 입력 데이터의 순서와 상관없이 일정하다. 숫자의 교체 횟수는 입력 데이터에 의존한다. 극단적인 경우, 입력 데이터가 우연히 작은 순으로 나열돼 있을 때는 교체가 한 번도 발생하지 않는다. 반대로 숫자가 큰 순대로 나열돼 있으면 비교할 때마다 교체해 주어야 한다. 따라서 버블 정렬의 계산 시간은 O(n2)가 된다.

 

참고 서적: