더북(TheBook)

4.2.1 버블 정렬 구현

다음은 파이썬으로 구현한 버블 정렬이다.

def bubble_sort(list): 
    unsorted_until_index = len(list) - 1  
    sorted = False 

    while not sorted:  
        sorted = True 
        for i in range(unsorted_until_index):  
            if list[i] > list[i+1]: 
                list[i], list[i+1] = list[i+1], list[i] 
                sorted = False  
        unsorted_until_index -= 1

    return list

위 함수는 다음 코드처럼 정렬되지 않은 배열을 전달하여 사용한다.

print(bubble_sort([65, 55, 45, 35, 25, 15, 10]))

그러면 함수는 정렬된 배열을 반환한다.

한 줄씩 나눠서 어떻게 동작하는지 살펴보자. 각 줄마다 설명을 먼저 하고 뒤이어 해당 코드를 보이겠다.

가장 먼저 unsorted_until_index 변수부터 생성한다. 이 변수는 아직 정렬되지 않은 배열의 가장 오른쪽 인덱스를 기록한다. 알고리즘을 처음 시작할 때는 전체 배열이 정렬되지 않은 상태이므로 배열의 마지막 인덱스로 변수를 초기화한다.

unsorted_until_index = len(list) - 1

배열의 정렬 여부를 기록하는 sorted 변수도 생성한다. 물론, 코드가 처음 실행될 때는 정렬되지 않은 상태이므로 False를 할당한다.

sorted = False

배열이 정렬될 때까지 계속 실행될 while 루프를 시작한다. 루프 한 번 실행이 배열의 한 패스스루에 해당한다.

while not sorted:

이어서 sortedTrue를 할당한다.

sorted = True

각 패스스루 안에서는 교환이 일어나기 전까지 배열이 정렬되어 있다고 가정하고 값을 교환하면 변수를 다시 False로 바꾸는 방식을 취한다. 이렇게 해야 어떤 교환도 하지 않고 전체 패스스루를 통과할 때 sortedTrue로 남아서 배열이 완전히 정렬된 상태임을 알 수 있다.

while 루프 내에서 for 루프를 시작한다. 루프 안에서는 배열 내 모든 값 쌍을 가리킨다. 변수 i를 첫 포인터로 사용해 배열의 첫 인덱스부터 아직 정렬되지 않은 인덱스까지 수행한다.

for i in range(unsorted_until_index):

for 루프 내에서는 모든 인접 값 쌍을 비교하고 순서가 뒤바뀌어 있으면 교환한다. 또한, 교환하게 되면 sortedFalse로 바꾼다.

if list[i] > list[i+1]:
    list[i], list[i+1] = list[i+1], list[i]
    sorted = False

각 패스스루가 끝나면 오른쪽으로 올려준 값(버블)이 이제 올바른 위치에 있음을 알 수 있다. 바꿔 말하면 기존에 가리키고 있던 인덱스가 이제 정렬된 상태이니 unsorted_until_index 값을 1 감소시킨다.

unsorted_until_index -= 1

sortedTrue가 되면, 즉 배열이 완전히 정렬되면 while 루프가 종료된다. 이때 정렬된 배열을 반환한다.

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