pythonデータ構造の複数のソートアルゴリズム

8357 ワード

#      
def selection_sort(my_list):
    i = 0
    while i < len(my_list):
        min_index = i
        j = i + 1
        while j < len(my_list):
            if my_list[j] < my_list[min_index]:
                min_index = j   #                  

            j += 1
        if my_list[min_index] != my_list[i]:  #                        ,     
            my_list[min_index], my_list[i] = my_list[i], my_list[min_index]

        i += 1



#      
def bubble_sort(my_list):
    n = len(my_list)
    swapped = False
    while n > 1:
        i = 1
        while i < n:
            if my_list[i] < my_list[i - 1]:
                my_list[i], my_list[i - 1] = my_list[i - 1], my_list[i]
                swapped = True
            i += 1
        n -= 1          


#      
def insert_sort(my_list):
    num = 1
    while num < len(my_list):
        i = num - 1
        need_item = my_list[num]
        while i >= 0:
            if need_item < my_list[i]:
                my_list[i + 1] = my_list[i]
                i -= 1
            else:
                break
        my_list[i + 1] = need_item
        num += 1


# ========================    =====================
def quick_sort(my_list):
    quick_helper(my_list, 0, len(my_list) - 1)


def quick_helper(lyst, left, right):
    """      """
    if left < right:  #                2
        boudary = get_boundary_postion(lyst, left, right)  #         
        quick_helper(lyst, left, boudary - 1)  #       
        quick_helper(lyst, boudary + 1, right)  #       


def get_boundary_postion(lyst, left, right):
    """
            
    :param lyst:        
    :param left:     
    :param right:     
    return:         
    """
    middle = (left + right) // 2  #        '//'   
    datum_point = lyst[middle]  #           
    lyst[middle] = lyst[right]  #              
    lyst[right] = datum_point
    boudary = left  #               
    for i in range(left, right):
        if lyst[i] < datum_point:  #               
            lyst[boudary], lyst[i] = lyst[i], lyst[boudary]  #               
            boudary += 1
    #                         ,
    #                    ,       
    lyst[boudary], lyst[right] = lyst[right], lyst[boudary]  
    return boudary


# ==================    ======================
def merge_sort(my_list):
    """       """
    copy_lyst = my_list.copy()
    merge_helper(my_list, copy_lyst, 0, len(my_list)-1)


def merge_helper(lyst, copy_lyst, left, right):
    """    """
    if left < right:
        middle = (left + right) // 2
        merge_helper(lyst, copy_lyst, left, middle)
        merge_helper(lyst, copy_lyst, middle+1, right)
        merge_(lyst, copy_lyst, left, middle, right)


def merge_(lyst, copy_lyst, left, middle, right):
    """
        
    :param lyst --    
    :param copy_lyst --                
    :param left  --    
    :param middle --  
    :param right --    
    """
    i1 = left  #          ,
    i2 = middle + 1  #          
    for i in range(left, right + 1):
        if i1 > middle:
            copy_lyst[i] = lyst[i2]
            i2 += 1
        elif i2 > right:
            copy_lyst[i] = lyst[i1]
            i1 += 1
        elif lyst[i1] < lyst[i2]:  #            
            copy_lyst[i] = lyst[i1]
            i1 += 1
        else:
            copy_lyst[i] = lyst[i2]
            i2 += 1

    for i in copy_lyst:
        lyst[i] = copy_lyst[i]




num = [1, 3, 4, 2, 1]
merge_sort(num)
print(num)

実はpythonを使ってソートアルゴリズムを実現する以上、2つの位置交換を実現する機能の中で、pythonが書いた交換方式ではなく、下位の方式を使うべきです.
def swapped(lyst, index1, index2):
    temp = lyst[index1]
    lyst[index1] = lyst[index2]
    lyst[index2] = temp