알고리즘

[알고리즘] 2) 버블 정렬 알고리즘

Alex, Yoon 2022. 6. 26. 15:06

[출처 DaleSeo]

버블 정렬 알고리즘

버블 정렬은 선택 정렬과 유사한 정렬 방식이다. 

선택 정렬은 '최소값'을 확정하고 난 후에 다음 비교로 넘어간 것에 반해 버블 정렬은 바로 직전, 직후 값들을 비교해 나가는 방식을 말한다. 

 

옆에 있는 값과 비교해서 더 작은 값을 앞으로 보낸다. 

선택 정렬과 마찬가지로 구현은 쉽지만, 시간복잡도로 봤을 때는 효율적이지 않은 정렬 방식이다. 

설명

1. 먼저 4와 3을 비교, 3이 더 작음으로 서로 스와핑한다. 

[4, 3, 5, 1, 2]
 ^  ^
4 > 3 => Swap
[3, 4, 5, 1, 2]

2. 이후 4와 5를 비교, 바꿀 필요가 없음을 확인. 

[3, 4, 5, 1, 2]
    ^  ^
4 < 5 => No Swap

3. 5와 1을 비교, 1이 더 작음으로 서로 스와핑 

[3, 4, 5, 1, 2]
       ^  ^
5 > 1 => Swap
[3, 4, 1, 5, 2]

이러한 과정을 반복 수행한다. 

파이썬 구현

def bubble_sort(arr):
    for i in range(len(arr) - 1, 0, -1):
        for j in range(i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]

[최적화]

1. 이전 차례에서 스와핑이 한번도 일어나지 않은 경우에는 정렬되지 않은 값이 하나도 없었다고 간주할 수 있다.

이럴 경우에는 비교를 지속하지 않고 종료한다. 

* swap True, False Flag 사용. 

Initial: [1, 2, 3, 5, 4]

 Pass 1: [1, 2, 3, 4, 5] => Swap 있었음
                      *
 Pass 2: [1, 2, 3, 4, 5] => Swap 없었음
                   *  *
=> 이전 패스에서 swap이 한 번도 없었으니 종료
def bubble_sort(arr):
    for i in range(len(arr) - 1, 0, -1):
        swapped = False
        for j in range(i):
            if arr[j] > arr[j + 1]:
                arr[j], arr[j + 1] = arr[j + 1], arr[j]
                swapped = True
        if not swapped:
            break

 

2. 마지막 스와핑 위치를 확인하여 기록하고, 그 뒤에 모조리 변화가 없었다면 비교 자체를 skip하는 방법.

* last_swap 변수 추가. 

Initial: [3, 2, 1, 4, 5]

 Pass 1: [2, 1, 3, 4, 5] => 마지막 Swap 위치가 index 1
             ^        *
 Pass 2: [1, 2, 3, 4, 5] => 중간 패스 skip하고 바로 index 1로 보낼 값 찾기
          ^     *  *  *
def bubble_sort(arr):
    end = len(arr) - 1
    while end > 0:
        last_swap = 0
        for i in range(end):
            if arr[i] > arr[i + 1]:
                arr[i], arr[i + 1] = arr[i + 1], arr[i]
                last_swap = i
        end = last_swap
반응형