归并排序

2021-04-20  本文已影响0人  星光下的胖子

一、原理

“分而治之”的思想:

二、代码实现

import numpy as np
from time import time

# 合并数组
def merge(arr_left, arr_right, reverse=False):
    i, j = 0, 0  # i,j分别是arr_left和arr_right的起始索引标记
    temp_list = []  # 定义一个临时数组,用来保存合并后的元素
    
    while i < len(arr_left) and j < len(arr_right):
        if reverse:  # 从大到小排序
            if arr_left[i] >= arr_right[j]:
                temp_list.append(arr_left[i])
                i += 1
            else:
                temp_list.append(arr_right[j])
                j += 1
        else:  # 从小到大排序
            if arr_left[i] <= arr_right[j]:
                temp_list.append(arr_left[i])
                i += 1
            else:
                temp_list.append(arr_right[j])
                j += 1
    if i == len(arr_left):
        temp_list.extend(arr_right[j:])
    else:
        temp_list.extend(arr_left[i:])
        
    return temp_list

# (二分)归并排序
def merge_sort(arr, reverse=False):
    if len(arr) <= 1:
        return arr
    
    index_middle = len(arr) // 2
    arr_left = merge_sort(arr[:index_middle], reverse)
    arr_right = merge_sort(arr[index_middle:], reverse)
    
    return merge(arr_left, arr_right, reverse)


if __name__ == "__main__":
    arr = [8, 9, 1, 7, 2, 3, 5, 4, 6]
    print("排序前的数组:", arr)
    sorted_arr = merge_sort(arr)  # 默认reverse=False,表示从小到大排序
    print("从小到大排序:", sorted_arr)
    sorted_arr = merge_sort(arr, reverse=True)  # 从大到小排序
    print("从大到小排序:", sorted_arr)
    
    print("----------")
    # 归并排序
    np.random.seed(10)
    array = list(np.random.randint(0, 1000, size=(2000,)))
    start = time()
    sorted_arr = merge_sort(array, reverse=False)
    end = time()
    print(f"merge_sort()函数耗时{end - start}秒")
    print(sorted_arr[:100])

运行结果:

上一篇 下一篇

猜你喜欢

热点阅读