from __future__ import print_function
from sys import stdin

def printf(str, *args):
    print(str % args, end='')

# 버블 정렬을 위한 클래스 선언
class bubbleSort:
    def __init__(self, array):
        self.array = array
        self.length = len(array)
  
    def __str__(self):
        return " ".join([str(x) 
                        for x in self.array])
    
    # 재귀적인 버블 정렬 함수 정의
    def bubbleSortRecursive(self, n=None):
        if n is None:
            n = self.length
        count = 0
  
        # 기본 단계
        if n == 1:
            return
        for i in range(n - 1):
            if self.array[i] > self.array[i + 1]:
                self.array[i], self.array[i +
                1] = self.array[i + 1], self.array[i]
                count = count + 1
        
        if (count==0):
            return
  
        # 배열의 나머지 부분에 대해 재귀함수 호출
        self.bubbleSortRecursive(n - 1)
 
# 배열을 표로 출력하는 함수
def display(array):
    print("\n\t    \u250f\u2500\u2500\u2500", end = "") 
    for i in range(0, len(array) + 1):
        print("\u2500\u2500\u2500\u2500\u2500", end = "")
        if i == len(array):
            print("\u2513\n", end = "")
        else:
            print("\u252f", end = "")
    
    print("\t    \u2503 인덱스 \u2503", end = "")
    for i in range(1, len(array) + 1):
        printf(" %3d \u2503"%i)
    
    print("\n\t    \u2523\u2500\u2500\u2500", end = "")
    for i in range(0, len(array) + 1):
        print("\u2500\u2500\u2500\u2500\u2500", end = "")
        if i == len(array):
            print("\u252b\n", end = "")
        else:
            print("\u254b", end = "")
    
    print("\t    \u2503   값   \u2503", end = "")
    for i in range(1, len(array) + 1):
        printf(" %3d \u2503"%array[i - 1])
    
    print("\n\t    \u2517\u2500\u2500\u2500", end = "") 
    for i in range(0, len(array) + 1):
        print("\u2500\u2500\u2500\u2500\u2500", end = "")
        if i == len(array):
            print("\u251b\n", end = "")
        else:
            print("\u253b", end = "")

def main():
    # 해당 프로그램에 대한 안내 출력
    print("\n\t\t\t    \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510")
    print("\t\t\t    \u2502            버블 정렬 프로그램             \u2502")
    print("\t\t\t    \u2514\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2518\n")
    # 배열을 선언해서 정렬되지 않는 자료들을 초기화
    array = [18, 36, 66, 72, 15, 42, 7, 4, 20, 60, 48]
    printf("\n\t\t\t     초기 자료들은 다음과 같다.\n")
    display(array)   # 정렬 전 배열 출력

    printf("\n\t\t    버블 정렬을 적용하여 오름차순으로 정렬됨.\n")
    # 선언된 배열에 대해 bubbleSort 클래스를 통해 객체를 sort에 대입
    sort = bubbleSort(array)
      
    # 재귀적인 버블 정렬 알고리즘 실행
    sort.bubbleSortRecursive()
    display(array)   # 정렬 후 배열 출력
  
  
if __name__ == "__main__":
    main() 
