Knowledge Map

DataStructure in Python[Bubble Sort] 본문

PYTHON

DataStructure in Python[Bubble Sort]

2016. 5. 8. 14:13

출처 : http://onestep.tistory.com/44


버블 정렬은 인접한 요소를 비교, 교환을 반복해서 정렬하는 것으로 가장 느린 알고리즘이라고 한다.






처음에 원출처 안보고 한번 짜보았다가 저번에 짠 selection sort를 짜버려서 당황을 했었다.


버블 정렬의 가장 큰 특징은 현 [인덱스 -1] 값과 비교한다는 것이다.

물론 현 인덱스 +1 값과 비교하는 것도 좋겠지만 

짜다보니 인덱스 -1 값으로 짜게 되더라. 굳이 +1 로는 짜볼 생각이 나질 않았다.


이중 루프를 사용하는데 2번째 for 문에서 보면 len(list)-i을 하는 것을 볼수 있다.

버블 정렬은 처음 루트때 가장 큰 값이 가장 뒤쪽에 위치하게 된다.

따라서 len(list)-i를 함으로써 불필요한 횟수를 감소시키는 것이다.

또한 바로 전 인덱스 값을 비교해야하기 때문에 두번째 for문의 비교문을 보면 list[j-1]을 볼수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import random
 
def bubbleSort(list):
    for i in range(len(list)-1):
        for j in range(1len(list)-i):
 
            for k in range(len(list)):
                if k == j or k == j-1:
                    print('[{}]'.format(list[k]),end='')
                else:
                    print(' {} '.format(list[k]),end='')
            if list[j-1]>list[j]:
                list[j-1],list[j] = list[j],list[j-1]
            print()
        print()
 
def Main():
 
    # 테스트 할 랜덤 넘버 리스트 생성
    list = []
    for i in range(0,21):
        list.append(random.randint(1,99))
 
    print('==============버블 정렬 전==============')
    for i in list:
        print('*'* i)
    print()
 
    bubbleSort(list)
    print('==============버블 정렬후==============')
    for i in list:
        print('*'* i)
 
Main()
cs



비교를 한다음에 두 값을 서로 교환한 직전의 모습을 출력시켜보았다.

비교를 했을 때, 뒷값이 작으면 치환이 된다.

아래의 출력 하면은 서로 치환되기 전의 출력이 그 다음 라인에서는 치환되는 것을 보여준다.

1번째 루프를 도는 동안의 모습이므로 전체 모습이 궁금하면 직접 돌려보면 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
 
[88][15] 61  23  7  6  88  65  85  81  22  25  19  5  70  39  97  32  81  15  17 
 15 [88][61] 23  7  6  88  65  85  81  22  25  19  5  70  39  97  32  81  15  17 
 15  61 [88][23] 7  6  88  65  85  81  22  25  19  5  70  39  97  32  81  15  17 
 15  61  23 [88][7] 6  88  65  85  81  22  25  19  5  70  39  97  32  81  15  17 
 15  61  23  7 [88][6] 88  65  85  81  22  25  19  5  70  39  97  32  81  15  17 
 15  61  23  7  6 [88][88] 65  85  81  22  25  19  5  70  39  97  32  81  15  17 
 15  61  23  7  6  88 [88][65] 85  81  22  25  19  5  70  39  97  32  81  15  17 
 15  61  23  7  6  88  65 [88][85] 81  22  25  19  5  70  39  97  32  81  15  17 
 15  61  23  7  6  88  65  85 [88][81] 22  25  19  5  70  39  97  32  81  15  17 
 15  61  23  7  6  88  65  85  81 [88][22] 25  19  5  70  39  97  32  81  15  17 
 15  61  23  7  6  88  65  85  81  22 [88][25] 19  5  70  39  97  32  81  15  17 
 15  61  23  7  6  88  65  85  81  22  25 [88][19] 5  70  39  97  32  81  15  17 
 15  61  23  7  6  88  65  85  81  22  25  19 [88][5] 70  39  97  32  81  15  17 
 15  61  23  7  6  88  65  85  81  22  25  19  5 [88][70] 39  97  32  81  15  17 
 15  61  23  7  6  88  65  85  81  22  25  19  5  70 [88][39] 97  32  81  15  17 
 15  61  23  7  6  88  65  85  81  22  25  19  5  70  39 [88][97] 32  81  15  17 
 15  61  23  7  6  88  65  85  81  22  25  19  5  70  39  88 [97][32] 81  15  17 
 15  61  23  7  6  88  65  85  81  22  25  19  5  70  39  88  32 [97][81] 15  17 
 15  61  23  7  6  88  65  85  81  22  25  19  5  70  39  88  32  81 [97][15] 17 
 15  61  23  7  6  88  65  85  81  22  25  19  5  70  39  88  32  81  15 [97][17]
 
cs


개인적으로는 selection sort랑 그다지 코드가 많이 다르지는 않는 거 같다. 이중 루프라서 O(N^2) 의 성능을 가지는 것도 유사하다.


'PYTHON' 카테고리의 다른 글

IPython notebook 단축키 모음  (0) 2016.05.09
엑셀 라이브러리 사용하기  (0) 2016.05.09
DataStructure in Python[Selection Sort]  (0) 2016.05.07
DataStructure in Python[큐&스택]  (0) 2016.05.07
DataStructure in Python[연결리스트]  (0) 2016.05.02
Comments