def selection_sort(a):
for i in range(0, len(a)-1):
minimum = i
for j in range(i, len(a)):
if a[minimum] > a[j]:
minimum = j
a[i], a[minimum] = a[minimum], a[i]
a = [54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
print('정렬 전:\t', end='')
print(a)
selection_sort(a)
print('정렬 후:\t', end='')
print(a)
def insertion_sort(a):
for i in range(1, len(a)):
for j in range(i, 0, -1):
if a[j-1] > a[j]:
a[j], a[j-1] = a[j-1], a[j]
a = [54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
print('정렬 전:\t', end='')
print(a)
insertion_sort(a)
print('정렬 후:\t', end='')
print(a)
def shell_sort(a):
h = 4 # 3x+1 간격: 1, 4, 13, 40, 121,... 중에서 4 와 1만 사용
while h >= 1:
for i in range(h, len(a)): # h-정렬 수행
j = i
while j >= h and a[j] < a[j-h]:
a[j], a[j-h] = a[j-h], a[j]
j -= h
h //= 3
a = [54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
print('정렬 전:\t', end='')
print(a)
shell_sort(a)
print('정렬 후:\t', end='')
print(a)
def downheap(i, size):
while 2*i <= size:
k = 2*i
if k < size and a[k] < a[k+1]:
k += 1
if a[i] >= a[k]:
break
a[i], a[k] = a[k], a[i]
i = k
def create_heap(a): # 초기 힙 만들기
hsize = len(a) - 1
for i in reversed(range(1, hsize//2+1)):
downheap(i, hsize)
def heap_sort(a):
N = len(a) - 1
for i in range(N):
a[1], a[N] = a[N], a[1]
downheap(1, N-1)
N -= 1
a = [-1,54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
print('정렬 전:\t', end='')
print(a)
create_heap(a) # 힙 만들기
print('최대힙 : \t', end='')
print(a)
heap_sort(a)
print('정렬 후 :\t', end='')
print(a)
import heapq
a = [54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
print('정렬전:\t', a)
heapq.heapify(a)
print('힙:\t', a)
s = []
while a:
s.append(heapq.heappop(a))
print('정렬후:\t', s)
def merge(a, b, low, mid, high):
i = low
j = mid+1
for k in range(low, high+1): # a의 앞/뒷부분을 합병하여 b에 저장
if i > mid:
b[k] = a[j] # 앞부분이 먼저 소진된 경우
j += 1
elif j > high:
b[k] = a[i] # 뒷부분이 먼저 소진된 경우
i += 1
elif a[j] < a[i]:
b[k] = a[j] # a[j]가 승자
j += 1
else:
b[k] = a[i] # a[i]가 승자
i += 1
for k in range(low, high+1):
a[k] = b[k] # b를 a에 복사
def merge_sort(a, b, low, high):
if high <= low:
return
mid = low + (high - low) // 2
merge_sort(a, b, low, mid) # 앞부분 재귀호출
merge_sort(a, b, mid + 1, high) # 뒷부분 재귀호출
merge(a, b, low, mid, high) # 합병 수행
a = [54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
b = [None] * len(a)
print('정렬 전:\t', end='')
print(a)
merge_sort(a, b, 0, len(a)-1)
print('정렬 후 :\t', end='')
print(a)
def qsort(a, low, high):
if low < high:
pivot = partition(a,low,high)
qsort(a, low, pivot-1)
qsort(a, pivot+1, high)
def partition(a, pivot, high):
i = pivot + 1
j = high
while True:
while i < high and a[i] < a[pivot]:
i += 1
while j > pivot and a[j] > a[pivot]:
j -= 1
if j <= i:
break
a[i], a[j] = a[j], a[i]
i += 1
j -= 1
a[pivot], a[j] = a[j], a[pivot]
return j
a = [54,88,77,26,93,17,49,10,17,77,11,31,22,44,17,20]
print('정렬 전:\t', a)
qsort(a, 0, len(a)-1)
print('정렬 후:\t', a)
def lsd_sort(a):
WIDTH = 3 # 스트링의 문자 수
N = len(a) # 입력 크기
R = 128 # radix 크기
temp = [None] * N
for d in reversed(range(WIDTH)): # d번째 문자 처리 , d =2, 1, 0
count = [0] * (R+1)
for i in range(N): # 빈도수 계산
count[ord(a[i][d])+1] += 1 # ord() 인자의 unicode 값 리턴
for j in range(1, R): # 빈도수 누적 계산
count[j] += count[j-1]
for i in range(N): # data 복사
p = ord(a[i][d])
temp[count[p]] = a[i]
count[p] += 1
for i in range(N): # t를 a로 복사
a[i] = temp[i]
print('%d번째 문자:\t ' % d, end='')
for x in a: print(x, ' ', end='')
print()
a = ['ICN', 'SFO', 'LAX', 'FRA', 'SIN', 'ROM', 'HKG', 'TLV',
'SYD', 'MEX', 'LHR', 'NRT', 'JFK', 'PEK', 'BER', 'MOW']
print('정렬 전:\t ', end='')
for x in a: print(x, ' ', end='')
print()
lsd_sort(a)