algorithm/theory

기수 정렬.

qkqhxla1 2016. 6. 14. 17:22

정렬 방법론.

원소들의 첫,두,~~n번째 자리수 따라 새로운 리스트에 넣는다.

ex) 첫번째의 경우 71은 [1]위치에, 97은 [7]위치에 들어간다.(일의자리 기준)

두번째의 경우 십의 자리수를 기초로 정렬한다.

~~ n의 자리수를 기초로 정렬.


설명이 잘된 블로그 : http://kaheeyah.blog.me/220704468091


# -*- encoding: cp949 -*-
import time
import random
import Queue
   
N = 10000
M = 5

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 digit(d,k):
    temp = 1
    for i in range(1,k):
        temp *= 10
    d /= temp
    d %= 10
    return d

def RadixSort(a,n,m,q):
    for k in range(1,m+1):
        for i in range(1,n+1):
            kd = digit(a[i],k)
            q[kd].put(a[i])
        p = 0
        for i in range(10):
            while not q[i].empty():
                p += 1
                a[p] = q[i].get()
 
def main():
    a = [random.randint(1,65536) for i in range(0,N+1)] #랜덤한 10000개의 데이터
    a[0] = -1
    Q = [Queue.Queue() for i in range(10)]
    start_time = time.time()
    RadixSort(a,N,M,Q)
    print '(랜덤)기수 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)

    a = [i for i in range(0,N+1)] #정렬된 10000개의 데이터 #리커전이 너무 많이 일어나서 랜덤한 데이터밖에 정렬이 안된다.
    a[0] = -1
    Q = [Queue.Queue() for i in range(10)]
    start_time = time.time()
    RadixSort(a,N,M,Q)
    print '(최고)기수 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)
  
    a = [i for i in range(N,-1,-1)] #최악의 경우의 10000개의 데이터
    a[0] = -1
    Q = [Queue.Queue() for i in range(10)]
    start_time = time.time()
    RadixSort(a,N,M,Q)
    print '(최악)기수 정렬의 실행 시간 (N = {} ) : {}'.format(N,time.time()-start_time)
    CheckSort(a,N)
if __name__=='__main__':
    main()


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

이진 탐색.  (0) 2016.06.15
순차 탐색.  (0) 2016.06.15
계수 정렬.  (0) 2016.06.14
힙 정렬.  (0) 2016.06.13
합병 정렬.  (0) 2016.06.13