python 3 일반적인 정렬 알고리즘 구현(예시 코드)

거품 정렬
거품 정렬 은 간단 한 정렬 알고리즘 이다.그것 은 정렬 할 수열 을 반복 적 으로 방문 하여 한 번 에 두 요 소 를 비교 한 적 이 있 으 며,만약 그들의 순서 가 틀 리 면 그것들 을 교환 할 것 이다.방문 수열 작업 은 더 이상 교환 이 필요 하지 않 을 때 까지 반복 적 으로 진행 된다.즉,이 수열 은 이미 정렬 이 완료 되 었 다 는 것 이다.이 알고리즘 의 이름 은 작은 요소 일수 록 교환 을 통 해 서서히 수열 의 맨 위로 떠 오 르 기 때문이다.

def mao(lst):
    for i in range(len(lst)):
        #         ,             
        #            
        #  i   ,  i      
        #     len-1 -i  len-1          
        #      0 len -1 -i     

        # flag                 
        #    flag       (          ),    ,    
        flag = False
        for j in range(len(lst) - i - 1):
            if lst[j] > lst[j + 1]:
                lst[j], lst[j + 1] = lst[j + 1], lst[j]
                flag = True
                #       ,  flag
        if not flag:
            return lst
    return lst

print(mao([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
정렬 선택
정렬 을 선택 하 는 것 은 간단 하고 직관 적 인 정렬 알고리즘 이다.그의 작업 원리:먼저 정렬 되 지 않 은 시퀀스 에서 최소(큰)요 소 를 찾 아 정렬 된 시퀀스 의 시작 위치 에 저장 한 다음 에 나머지 정렬 되 지 않 은 요소 에서 최소(큰)요 소 를 계속 찾 은 다음 에 정렬 된 시퀀스 의 끝 에 놓 습 니 다.모든 요소 가 정렬 될 때 까지 유추 합 니 다.

#            
#                     ,        。
#       
#   0   i       ,    i+1 len(lst)-1  

def select_sort(lst):
    for i in range(len(lst)):
        min_index = i  #             
        for j in range(i + 1, len(lst)):
            if lst[j] < lst[min_index]:
                min_index = j

        #   ,    ,min_index  i+1  len(lst) - 1           
        lst[i], lst[min_index] = lst[min_index], lst[i]

    return lst


def select_sort2(lst):
    #           
    #         
    #            min_index
    #        i   i+1 len(lst)     

    for i in range(len(lst)):
        for j in range(len(lst) - i):

            # lst[i + j]   i len(lst)-1    
            #   j <= len(lst) -i   j + i <= len(lst)
            if lst[i] > lst[i + j]:
                #         ,    
                lst[i], lst[i + j] = lst[i + j], lst[i]
    return lst


print(select_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
print(select_sort2([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
빠 른 정렬
빠 른 정렬 은 한 번 의 정렬 을 통 해 대기 기록 을 독립 된 두 부분 으로 나 누 는 것 이다.그 중에서 일부 기록 의 키 워드 는 모두 다른 부분의 키워드 보다 작 으 면 각각 이 두 부분의 기록 을 계속 정렬 하여 전체 서열 의 질 서 를 달성 할 수 있다.

#   
# 1.           i
# 2.       i        ,        
# 3.     
# 4.       ,   1    
# 5.            

def quicksort(lst):
    if len(lst) < 2:    # lst     
        return lst

    # ['pɪvət]    
    pivot = lst[0]
    less_lst = [i for i in lst[1:] if i <= pivot]
    greater_lst = [i for i in lst[1:] if i > pivot]
    #        
    #                 +     +      
    #         + +    +     +   +  +  
    #      ...........    +     + ............
    return quicksort(less_lst) + [pivot] + quicksort(greater_lst)


print(quicksort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
print(quicksort([1, 5, 8, 62]))
삽입 정렬
정렬 을 삽입 하 는 알고리즘 설명 은 간단 하고 직관 적 인 정렬 알고리즘 이다.그것 의 작업 원 리 는 질서 있 는 서열 을 구축 하여 정렬 되 지 않 은 데이터 에 대해 정렬 된 서열 에서 뒤로 스 캔 하여 해당 하 는 위 치 를 찾 아 삽입 하 는 것 이다.

# lst [0, i)      ,       
#         i  lst[i] lst[0 : i]       
#   ,lst[i] ,       
#       ,lst[i]    ,  j   , lst[j]       
#          lst[i+1]  (lst[i+1]    lst[i])
#
#         ,    

def insert_sort(lst: list):
    #         1  ,   0      
    #             
    for i in range(1, len(lst)):
        #      0  ,  lst[0]          
        for j in range(i):
            if lst[i] < lst[j]:
                lst.insert(j, lst[i])
                # lst[i]     j    ,j        +1 ,    lst[i+1]
                del lst[i + 1]
    return lst

print(insert_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
힐 정렬
힐 정렬 은 1959 년 에 Shell 이 발명 한 것 으로 첫 번 째 로 O(n2)를 돌파 한 정렬 알고리즘 으로 정렬 을 간단하게 삽입 하 는 개선 판 입 니 다.정렬 을 삽입 하 는 것 과 다른 점 은 거리 가 먼 요 소 를 우선 시 한 다 는 점 이다.힐 정렬 은 축소 증분 정렬 이 라 고도 한다.

힐 정렬

#                  
# 1.   :
#                      
#             ,   lst   
# 2.       ,       
# 3.     :
#                          
#                        
# 4.        
# 5.      1,     
#

def shell_sort(lst):
    lst_len = len(lst)
    gap = lst_len // 2  #   2,   
    while gap >= 1:  #    0   
        for i in range(gap, lst_len):
            temp = lst[i]
            j = i
            #     
            while j - gap >= 0 and lst[j - gap] > temp:
                lst[j] = lst[j - gap]
                j -= gap
            lst[j] = temp
        gap //= 2
    return lst


print(shell_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))


#   
#       gap = 2
# [5, 2, 4, 3, 1]
# [5, 4, 1] [2, 3]
# [1, 4, 5, 2, 3]
#       gap = 1
# [1, 2, 3, 4, 5]

#   
#       gap = 3
# [5, 2, 4, 3, 1, 6]
# [5, 3] [2, 1] [4,6]
# [3, 5, 1, 2, 4 , 6]
#       gap = 1
# [1, 2, 3, 4, 5, 6]
병렬 정렬
병합 정렬 은 병합 작업 에 있어 서 효과 적 인 정렬 알고리즘 입 니 다.이 알고리즘 은 분 치 법(Divide and Conquer)을 사용 한 매우 전형 적 인 응용 이다.기 존 서열 의 하위 서열 을 합쳐서 완전히 질서 있 는 서열 을 얻는다.즉,모든 하위 서열 을 질서 있 게 한 다음 에 하위 서열 을 질서 있 게 하 는 것 이다.두 개의 질서 표를 하나의 질서 표 로 합치 면 2-로 병합 이 라 고 한다.

병렬 정렬

#      
#    lst       
#       
#     
#              ,      
#           
#       ,           


def merge(left, right):
    # left             ,             (     merge)
    # right    

    res = []
    while left and right:
        item = left.pop(0) if left[0] < right[0] else right.pop(0)
        res.append(item)

    #   ,left right       ,  extend  
    #   ,left right           ,       

    res.extend(left)
    res.extend(right)
    return res


def merge_sort(lst):
    lst_len = len(lst)
    if lst_len <= 1:
        return lst
    mid = lst_len // 2

    lst_right = merge_sort(lst[mid:len(lst)])       #     lst_len <= 1   lst   merge         
    lst_left = merge_sort(lst[:mid])                #     lst_len <= 1   lst   merge         

    return merge(lst_left, lst_right)               #     ,lst_left lst_right         


print(merge_sort([1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]))
더미 정렬
쌓 기 정렬 은 쌓 기 라 는 데이터 구 조 를 이용 하여 디자인 한 정렬 알고리즘 을 말한다.퇴적 은 완전 이 진 트 리 와 비슷 한 구조 이 며,동시에 퇴적 의 성질 을 만족 시 킵 니 다.즉,하위 노드 의 키 나 색인 은 항상 부모 노드 보다 작 습 니 다.그리고 정렬 을 합 니 다.

더미 정렬

#               
#      ( )     :     ( ),    
#
#   ----     
#
#   ----     
#         
#   lst = [1, 22 ,11, 8, 12, 4, 9]

# 1.         :
#          1
#        /   \
#       22    11
#      / \    / \
#     8  12  4   9
#
# 2.     ,        ,  :    <=    
#
#          1                                    1                                    1
#        /   \         13 22             /   \          4 11              / \
#       22    11       ==============>      13     11       ==============>       13    4
#      / \    / \                          / \    /  \                           / \   /  \
#     13  14 4   9                       22  14  4    9                        22  14 11   9
#
# 3.        ,    ,           
#
#                   1
#                  /
#             ~~~~/
#          22
#         /   \
#        8     4
#         \   /  \
#         12 11   9
#
# 4.        ,       ,       ,。。。。      
#
#          1                    1                 1  4                1 4           1 4 8           1 4 8
#           /                    /                  /                    /             /                 /
#       ~~~/                 ~~~/               ~~~/                 ~~~/          ~~~/              ~~~/
#      22                   4                 22                   8             22                9
#     /   \               /   \              /   \               /   \          /   \             /  \
#    8     4             8     9            8     9             12    9        12    9           12  11
#     \   /  \            \   /  \           \   /               \   /              /                /
#     12 11   9           12 11  22          12 11               22 11            11               22
#
#   :
#       1 4 8 9          1 4 8 9           1 4 8 9 11     1 4 8 9 11    1 4 8 9 11 12   ==>  1 4 8 9 11 12 22
#            /                  /                  /                /              /
#        ~~~/               ~~~/               ~~~/             ~~~/           ~~~/
#       22                 11                22                12            22
#      /   \              /   \             /                  /
#     12    11           12    22          12                22
#
#     

def heapify(lst, lst_len, i):
    """     """
    less = i  # largest        

    left_node_index = 2 * i + 1  #       
    right_node_index = 2 * i + 2  #       

    # lst[i]      (        ):
    #
    #                 lst[i]
    #                  /   \
    #      lst[2*i + 1]    lst[ 2*i + 2]
    #

    #      ,   ,             ‘>'    ‘<'   
    #
    if left_node_index < lst_len and lst[less] > lst[left_node_index]:
        less = left_node_index

    if right_node_index < lst_len and lst[less] > lst[right_node_index]:
        #          
        less = right_node_index

    if less != i:
        #   ,         ,        
        lst[i], lst[less] = lst[less], lst[i]  #   
        heapify(lst, lst_len, less)
        #      ,       

def heap_sort(lst):
    res = []
    i = len(lst)
    lst_len = len(lst)

    for i in range(lst_len, -1, -1):
        #          ,     
        heapify(lst, lst_len, i)

    #   ,          
    #   ,    ,    (   )    ,      
    for j in range(lst_len - 1, 0, -1):
        lst[0], lst[j] = lst[j], lst[0]  #   ,     j   

        heapify(lst, j, 0)      #       [0: j)    [j: lst_len-1]       
    return lst

arr = [1, 5, 55, 4, 5, 1, 3, 4, 5, 8, 62, 7]
print(heap_sort(arr))
참고:
10 대 고전 정렬 알고리즘(동 도 프 리 젠 테 이 션)
데이터 구조 와 알고리즘-정렬 편-python 설명
움 직 이 는 그림 은 여 기 를 클릭 하여 볼 수 있다.
나의 github
내 블 로그
나의 노트
python 3 에서 흔히 볼 수 있 는 정렬 알고리즘(예제 코드)을 실현 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 python 정렬 알고리즘 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 지원 을 바 랍 니 다!

좋은 웹페이지 즐겨찾기