2020年10月26日 星期一

Algorithm_Sort_Merge sort

Algorithm_Sort_Merge sort

tags: Algorithms Sort python
def merge(left_a, right_a):
    """合併兩個陣列"""
    def _merge():        
        while left_a and right_a:
#             print('_merge:', left_a, right_a)
            # 比較兩個陣列的第一個索引的值那一個比較小就優先回傳    
            yield (left_a if left_a[0] < right_a[0] else right_a).pop(0)
        yield from left_a
        yield from right_a
    return list(_merge())
        
def divide(input_array):
    """分割陣列"""
    # 取上高斯點做為中點切掉兩個陣列
    divide_point = len(input_array) // 2
    left_a = input_array[: divide_point]
    right_a = input_array[divide_point: ]
    return left_a, right_a  
    
def merge_sort(input_array):
    """利用遞迴呼執行分割、合併、排序"""
#     print('merge_sort_array:', input_array)
    if len(input_array) == 1:
#         print('return array:', input_array)
        return input_array
    left_a, right_a = divide(input_array)
    return merge(merge_sort(left_a), merge_sort(right_a))
    

下面給出五個資料集在不同資料量下的結果,其中

  • l1: 已經排序好的,由小到大
  • l2: 已經排序好的,但是逆排序,由大到小
  • l3: 亂數生成
  • l4: 亂數生成
  • l5: 亂數生成
Merge Sort 20000 40000 60000 80000 100000
l1 261 ms 585 ms 805 ms 1.35 s 2.18 s
l2 199 ms 528 ms 880 ms 1.47 s 2.09 s
l3 294 ms 844 ms 1.52 s 2.37 s 3.64 s
l4 282 ms 761 ms 1.45 s 2.39 s 3.42 s
l5 331 ms 735 ms 1.5 s 2.27 s 3.48 s

沒有留言:

張貼留言