본문 바로가기

공부/TIL-D

오늘배운거 깊게

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