Golang 歸並排序(MergeSort)



歸並排序是建立在歸並操作上的一種有效的排序算法。該算法是采用分治法(Divide and Conquer)的一個非常典型的應用。將已有序的子序列合並,得到完全有序的序列;即先使每個子序列有序,再使子序列段間有序。若將兩個有序表合並成一個有序表,稱為2-路歸並。

算法描述

  • 把長度為n的輸入序列分成兩個長度為n/2的子序列;
  • 對這兩個子序列分別采用歸並排序;
  • 將兩個排序好的子序列合並成一個最終的排序序列
def mergeSort(alist):
    """歸並排序(穩定|nlgn)"""
    n = len(alist)
    if n <= 1:
        return alist
    mid = n//2
    
    #left 采用歸並排序后形成新的有序列表
    left_li = mergeSort(alist[:mid])
    #right 采用歸並排序后形成新的有序列表
    right_li = mergeSort(alist[mid:])
    
    #merge(left, right) 將兩個有序的子序列合並為一個新的整體
    left_pointer, right_pointer = 0, 0
    result = []
    
    while left_pointer < len(left_li) and right_pointer<len(right_li):
        if left_li[left_pointer] < right_li[right_pointer]:
            result.append(left_li[left_pointer])
            left_pointer += 1
        else:
            result.append(right_li[right_pointer])
            right_pointer += 1
            
    result += left_li[left_pointer:]
    result += right_li[right_pointer:]
    return result


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM