def insertion_sort(li):
n=len(li)
# for i in range(1,n):
# temp=li[i]
# for j in range(i-1,-2,-1):
# if li[j]>temp:
# li[i]=li[j]
# li[j+1] =temp
for i in range(1,n):
temp=li[i]
for j in range(i-1,-2,-1):
if j == -1:
break
if li[j]>temp:
li[j+1]=li[j]
else:
break
li[j+1]=temp
def get_middle_idx(li,start,mid,end):
"""
리스트의 맨처음 값과 중간 값, 마지막값중에서
가운데 값이 위치한 인덱스를 반환한다.
"""
idx_li=[start,mid,end]
if li[idx_li[0]] < li[idx_li[1]]:
idx_li[0], idx_li[1] = idx_li[1], idx_li[0]
if li[idx_li[1]] > li[idx_li[2]]:
idx_li[1], idx_li[2]=idx_li[2], idx_li[1]
if li[idx_li[0]] > li[idx_li[1]]:
idx_li[0], idx_li[1]=idx_li[1], idx_li[0]
# if li[start]>li[mid]:
# idx_li[0], idx_li[1] = idx_li[1],idx_li[0]
# if li[start]>li[end]:
# idx_li[0], idx_li[2] = idx_li[2],idx_li[0] idx_li것들이 바뀌기 때문에 안됨
# if li[mid] > li[end]:
# idx_li[1], idx_li[2] = idx_li[2],idx_li[1]
return idx_li[1]
def quick_sort(li, start, end):
#base case
#to do
if start >= end:
return
left=start
right=end
mid=(left+right)//2
#추가된 코드
mid_idx=get_middle_idx(li,start,mid,end)
li[mid_idx], li[mid]=li[mid], li[mid_idx]
pivot=li[mid]
while left <= right:
while li[left] < pivot:
left+=1
while pivot < li[right]:
right-=1
if left <= right:
li[left], li[right] = li[right],li[left]
left+=1
right-=1
quick_sort(li, start, right)
quick_sort(li, left, end)
def selection_sort(li):
n=len(li)
for i in range(n-1):
min_idx=i
for j in range(i+1,n):
if li[j]<li[min_idx]:
min_idx=j
li[i],li[min_idx] = li[min_idx],li[i]
import random
if __name__=="__main__":
while True:
num_data=int(input('데이터 개수(종료:0):'))
if not num_data:
break
data=[random.randint(1, 100) for _ in range(num_data)]
print(data)
selection_sort(data)
print(data)
반응형
'공부 > TIL-D' 카테고리의 다른 글
프로와 아마추어의 차이 (0) | 2019.04.28 |
---|---|
머지소트, 스택,큐 ,연결리스트 코드 (0) | 2019.04.26 |
하노이타워 (0) | 2019.04.24 |
프로세스/스레드 CONTEXT SWITCHING (0) | 2019.04.23 |
O(빅오) , 메모리계층 (0) | 2019.04.22 |