더북(TheBook)

◉ 예제 소스 e11-1-bsort.py

# 거품 정렬

# 입력: 리스트 a

# 출력: 없음(입력으로 주어진 a가 정렬됨)

 

def bubble_sort(a):

    n = len(a)

    while True:          # 정렬이 완료될 때까지 계속 수행

        changed = False  # 자료를 앞뒤로 바꾸었는지 여부

        # 자료를 훑어보면서 뒤집힌 자료가 있으면 바꾸고 바뀌었다고 표시

        for i in range(0, n - 1):

            if a[i] > a[i + 1]: # 앞이 뒤보다 크면

                print(a)            # 정렬 과정 출력(참고용)

                a[i], a[i + 1] = a[i + 1], a[i] # 두 자료의 위치를 맞바꿈

                changed = True # 자료가 앞뒤로 바뀌었음을 기록

        # 자료를 한 번 훑어보는 동안 바뀐 적이 없다면 정렬이 완성된 것이므로 종료

        # 바뀐 적이 있으면 다시 앞에서부터 비교 반복

        if changed = = False:

            return

 

d = [2, 4, 5, 1, 3]

bubble_sort(d)

print(d)

 

◉ 실행 결과

[2, 4, 5, 1, 3]

[2, 4, 1, 5, 3]

[2, 4, 1, 3, 5]

[2, 1, 4, 3, 5]

[2, 1, 3, 4, 5]

[1, 2, 3, 4, 5]

 

거품 정렬의 입력으로 이미 정렬된 리스트가 주어졌을 때는 리스트를 한 번 훑어보는 동안 바꿀 자료가 없으므로 바로 정렬이 종료됩니다. 즉, 최선의 경우 계산 복잡도는 O(n)입니다.

단, 이미 정렬된 리스트가 아닌 일반적인 입력에 대한 거품 정렬의 계산 복잡도는 O(n2)입니다. 하지만 거품 정렬은 자료 위치를 서로 바꾸는 횟수가 선택 정렬이나 삽입 정렬보다 더 많기 때문에 실제로 더 느리게 동작한다는 단점이 있습니다.

 

 

 

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.