python实现原地归并排序 in-place_merge_sort

import time
def reverse(arr, i, index, j):
    list1 = arr[i:index]
    reverse_list1 = list(reversed(list1))  # 内存反转序列arr[i, index)
    list2 = arr[index:j]
    reverse_list2 = list(reversed(list2))  # 内存反转序列arr[index, j)
    list3 = list(reversed(reverse_list1 + reverse_list2))  # 原地归并两个子序列
    list4 = arr[0:i] + list3 + arr[j:]  # 归并后的整个序列
    for i in range(len(list4)):
        arr[i] = list4[i]
    return arr

def merge(arr, l, m, h):
    i = l
    j = m + 1
    while i < j and j <= h:
        while i < j and arr[i] <= arr[j]:
            i += 1
        index = j
        while j <= h and arr[j] < arr[i]:
            j += 1
        # print("low: {},index:{},high:{}".format(i, index, j))
        arr = reverse(arr, i, index, j)
        i = i + (j - index)
    return arr

def merge_sort(arr, l, h):
    if l < h:
        mid = l + (h - l) // 2
        merge_sort(arr, l, mid)
        merge_sort(arr, mid + 1, h)
        result = merge(arr, l, mid, h)
        return result

if __name__ == '__main__':
    user_input = input('输入10个以逗号分隔的数据:\n').strip()
    data=[int(item) for item in user_input.split(',')]
    print("排序前: ", data)
    start = time.perf_counter()
    result = merge_sort(data, 0, len(data) - 1)
    print("排序后:", result)
    end = time.perf_counter()
    print("总共用时:", end - start)

python实现原地归并排序 in-place_merge_sort_第1张图片

你可能感兴趣的:(python实现原地归并排序 in-place_merge_sort)