Computer Science/자료구조

[5.20] 06-2 버블 정렬

토마토. 2021. 5. 20. 13:56

버블 정렬 bubble sort = 단순 교환 정렬 - 이웃한 두 원소의 대소관계를 비교하여 필요에 따라 교환을 반복하는 알고리즘

버블 정렬 알아보기

pass - 비교/교환하는 과정 1세트

버블 정렬 프로그램

from typing import MutableSequence

def bubble_sort(a:MutableSequence) -> None:
    n = len(a)
    for i in range(n-1):
        for j in range(n-1, i, -1):
            if a[j-1] > a[j]:
                a[j-1], a[j] = a[j], a[j-1]

if __name__ == '__main__':
    print('버블 정렬을 수행합니다.')
    num = int(input('원소 수를 입력하세요'))
    x = [None] * num

    for i in range(num):
        x[i] = int(input(f'{i}번째 원소를 입력하세요 : '))

    bubble_sort(x)

    for i in range(num):
        print(f'x[{i}]는 {x[i]}입니다')

교환 과정 출력

from typing import MutableSequence

def bubble_sort(a:MutableSequence) -> None:
    n = len(a)
    count = 0
    chan = 0
    for i in range(n-1):
        print(f'패스 {i+1}')
        for j in range(n-1, i, -1):
            for m in range(0, n-1):
                print(f'{a[m]:2}' + ('  ' if m!= j-1 else
                                     '  ' if a[j-1] > a[j] else ' -'),
                                     end = '')
            print(f'{a[n-1]:2}')
            count += 1
            if a[j-1] > a[j]:
                chan += 1
                a[j-1], a[j] = a[j], a[j-1]
        for m in range(0, n-1):
            print(f'{a[m]:2}', end = '')
        print(f'{a[n-1]:2}')
    print(f'비교를 {count}번 했습니다.')
    print(f'교환을 {chan}번 했습니다.')
    
if __name__ == '__main__':
    print('버블 정렬을 수행합니다.')
    num = int(input('원소 수를 입력하세요'))
    x = [None] * num

    for i in range(num):
        x[i] = int(input(f'{i}번째 원소를 입력하세요 : '))

    bubble_sort(x)

    for i in range(num):
        print(f'x[{i}]는 {x[i]}입니다')

알고리즘의 개선 1

from typing import MutableSequence

def bubble_sort(a:MutableSequence) -> None:
    n = len(a)
    for i in range(n-1):
        exchng = 0
        for j in range(n-1, i, -1):
            if a[j-1] > a[j]:
                a[j-1], a[j] = a[j], a[j-1]
                exchng += 1
            if exchng == 0:
                break

if __name__ == '__main__':
    print('버블 정렬을 수행합니다.')
    num = int(input('원소 수를 입력하세요'))
    x = [None] * num

    for i in range(num):
        x[i] = int(input(f'{i}번째 원소를 입력하세요 : '))

    bubble_sort(x)

    for i in range(num):
        print(f'x[{i}]는 {x[i]}입니다')

알고리즘의 개선 2

from typing import MutableSequence

def bubble_sort(a:MutableSequence) -> None:
    n = len(a)
    for i in range(n-1):
        exchng = 0
        for j in range(n-1, i, -1):
            if a[j-1] > a[j]:
                a[j-1], a[j] = a[j], a[j-1]
                exchng += 1
            if exchng == 0:
                break

if __name__ == '__main__':
    print('버블 정렬을 수행합니다.')
    num = int(input('원소 수를 입력하세요'))
    x = [None] * num

    for i in range(num):
        x[i] = int(input(f'{i}번째 원소를 입력하세요 : '))

    bubble_sort(x)

    for i in range(num):
        print(f'x[{i}]는 {x[i]}입니다')

셰이커 정렬 알고리즘

from typing import MutableSequence

def bubble_sort(a:MutableSequence) -> None:
    left = 0
    right = len(a) -1
    last = right
    while left < right:
        for j in range(right, left, -1):
            if a[j-1] > a[j]:
                a[j-1], a[j] = a[j], a[j-1]
                last = j
        left = last

        for j in range(left, right):
            if a[j] > a[j+1]:
                a[j], a[j+1] = a[j], a[j-1]
                last = j
            right = last
            
if __name__ == '__main__':
    print('버블 정렬을 수행합니다.')
    num = int(input('원소 수를 입력하세요'))
    x = [None] * num

    for i in range(num):
        x[i] = int(input(f'{i}번째 원소를 입력하세요 : '))

    bubble_sort(x)

    for i in range(num):
        print(f'x[{i}]는 {x[i]}입니다')