algorithm/theory

버블 정렬.

qkqhxla1 2016. 6. 10. 14:09

정렬 방법론.

1. N번째 위치와 N+1번째 위치의 값을 비교해서, N+1번째 위치의 값이 더 클 경우 N번째와 N+1번째의 값을 교환함. 


특징.

1. 계속 비교하므로 리스트 크기가 크면 불리하다.

2. 정렬이 거의 된 데이터일 경우 더 유리하다.(교환이 적게 일어나므로)

3. 데이터가 역순인경우, 즉 최악의경우에 시간이 엄청 느리다.






N개의 원소에 대해서 N-1번의 비교를 해야 되기 때문에

비교횟수는 N(N-1)2, 시간 복잡도는 O(n^2) 이 된다.


10000개의 데이터를 돌려봤는데 예상한대로 나왔다.


시간복잡도가 같이 n^2인데도 시간 차이가 나는건 위에서 언급했듯이 최악의 경우에 교환이 더 많이 일어나서 오래걸리는것으로 보인다.



# -*- encoding: cp949 -*-
import time
import random

N = 10000
def swap(a,i,j):
    a[i],a[j] = a[j],a[i]

def CheckSort(a,n):
    Sorted = True
    for i in range(n):
        if a[i] > a[i+1]:
            Sorted = False
        if not Sorted:
            break
    if Sorted: print '정렬 완료.'
    else: print '정렬 오류 발생.'

def BubbleSort(a,N): #버블 정렬
    for i in range(N,0,-1):
        for j in range(1,i):
            if a[j] > a[j+1]:
                swap(a,j,j+1)

def main():
    a = [random.randint(1,65536) for i in range(N+1)] #랜덤한 10000개의 데이터
    start_time = time.time()
    BubbleSort(a,N)
    print '(랜덤)버블 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)

    a = [i for i in range(N+1)] #정렬된 10000개의 데이터
    start_time = time.time()
    BubbleSort(a,N)
    print '(최고)버블 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)

    a = [i for i in range(N,-1,-1)] #최악의 경우의 10000개의 데이터
    start_time = time.time()
    BubbleSort(a,N)
    print '(최악)버블 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)

if __name__=='__main__':
    main()

'algorithm > theory' 카테고리의 다른 글

합병 정렬.  (0) 2016.06.13
퀵 정렬.  (0) 2016.06.12
쉘 정렬.  (0) 2016.06.11
삽입 정렬.  (0) 2016.06.11
선택 정렬.  (0) 2016.06.10