ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 알고리즘 버블 정렬
    자료구조와 알고리즘 2020. 10. 29. 19:24

    1. 정렬 (sorting) 이란?

    • 정렬 (sorting): 어떤 데이터들이 주어졌을 때 이를 정해진 순서대로 나열하는 것
    • 정렬은 프로그램 작성시 빈번하게 필요로 함
    • 다양한 알고리즘이 고안되었으며, 알고리즘 학습의 필수

    다양한 정렬 알고리즘 이해를 통해, 동일한 문제에 대해 다양한 알고리즘이 고안될 수 있음을 이해하고, 각 알고리즘간 성능 비교를 통해, 알고리즘 성능 분석에 대해서도 이해할 수 있음

     

    2. 버블 정렬 (bubble sort) 란? 

    • 두 인접한 데이터를 비교해서, 앞에 있는 데이터가 뒤에 있는 데이터보다 크면, 자리를 바꾸는 정렬 알고리즘

    직접 눈으로 보면 더 이해가 쉽다: https://visualgo.net/en/sorting

    3. 어떻게 코드로 만들까?

    알고리즘 연습 방법에 기반해서 단계별로 생각해봅니다.

    프로그래밍 연습
    1. 데이터가 두 개일 때 버블 정렬 알고리즘 방식으로 정렬해보세요


    2. 데이터가 세 개일 때 버블 정렬 알고리즘 방식으로 정렬해보세요

     

    3.데이터가 네 개일 때 버블 정렬 알고리즘 방식으로 정렬해보세요

     

    list = [4,3,2,1,10 ,9 ,8, 7, 6, 5]
    for y in range(len(list)-1): #턴 모두가 ex) len이 9일때 , 8일떄, 7일때 ...
        for i in range(len(list)-1-y): #데이터 갯수 -1만큼 비교하면 된다.
            if(list[i]> list[i+1]):
                list[i], list[i+1] = list[i+1],list[i]
    print(list)        

    두번쨰 for문에서 1턴이 지나면 맨 마지막은 무조건 제일 큰수가 가있기 때문에 굳이 비교 안해도 된다.

     

    • 데이터가 네 개 일때 (데이터 갯수에 따라 복잡도가 떨어지는 것은 아니므로, 네 개로 바로 로직을 이해해보자.)
      • 예: data_list = [1, 9, 3, 2]
        • 1차 로직 적용
          • 1 와 9 비교, 자리바꿈없음 [1, 9, 3, 2]
          • 9 와 3 비교, 자리바꿈 [1, 3, 9, 2]
          • 9 와 2 비교, 자리바꿈 [1, 3, 2, 9]
        • 2차 로직 적용
          • 1 와 3 비교, 자리바꿈없음 [1, 3, 2, 9]
          • 3 과 2 비교, 자리바꿈 [1, 2, 3, 9]
          • 3 와 9 비교, 자리바꿈없음 [1, 2, 3, 9]
        • 3차 로직 적용
          • 1 과 2 비교, 자리바꿈없음 [1, 2, 3, 9]
          • 2 과 3 비교, 자리바꿈없음 [1, 2, 3, 9]
          • 3 과 9 비교, 자리바꿈없음 [1, 2, 3, 9]

    4. 알고리즘 구현

    • 특이점 찾아보기
      • n개의 리스트가 있는 경우 최대 n-1번의 로직을 적용한다.
      • 로직을 1번 적용할 때마다 가장 큰 숫자가 뒤에서부터 1개씩 결정된다.
      • 로직이 경우에 따라 일찍 끝날 수도 있다. 따라서 로직을 적용할 때 한 번도 데이터가 교환된 적이 없다면 이미 정렬된 상태이므로 더 이상 로직을 반복 적용할 필요가 없다.
    1. for num in range(len(data_list)) 반복
    2. swap = 0 (교환이 되었는지를 확인하는 변수를 두자)
    3. 반복문 안에서, for index in range(len(data_list) - num - 1) n - 1번 반복해야 하므로
    4. 반복문안의 반복문 안에서, if data_list[index] > data_list[index + 1] 이면
    5. data_list[index], data_list[index + 1] = data_list[index + 1], data_list[index]
    6. swap += 1
    7. 반복문 안에서, if swap == 0 이면, break 끝
    def bubblesort(data):
        for index in range(len(data) - 1):
            swap = False
            for index2 in range(len(data) - index - 1):
                if data[index2] > data[index2 + 1]:
                    data[index2], data[index2 + 1] = data[index2 + 1], data[index2]
                    swap = True
            
            if swap == False:
                break
        return data

    5. 알고리즘 분석

    • 반복문이 두 개 O(𝑛2n2)
      • 최악의 경우, 𝑛(𝑛1)2n∗(n−1)2
    • 완전 정렬이 되어 있는 상태라면 최선은 O(n)

    '자료구조와 알고리즘' 카테고리의 다른 글

    알고리즘 삽입 정렬  (0) 2020.10.30
    알고리즘 선택 정렬  (0) 2020.10.29
    알고리즘 들어가기  (0) 2020.10.29
    자료구조 힙2  (0) 2020.10.28
    자료구조 힙  (0) 2020.10.27
전설의 개발자