排序算法——归并排序Python实现

# -*- coding: utf-8 -*-
"""
@File  : merge_sort.py
@Author: Zhang_San
@Time  : 2020/7/22 00:49
@des   : 归并排序:先将序列进行划分,一直划分到每个最小的单元是一个数为止,然后合并最小的单元,在合并两个单元时,
                 依次比较当前两个单元中的值进行排序,最终形成一个有序的新单元
         每一个排序后的有序序列可以看作由以下两步组成:
         (1)两个有序的字序列(也是通过归并排序形成的)
         (2)两个有序序列的合并
"""

def merge_subsequence(arr, start, m, end):
    # 重新开两个数组,用于要合并的两个子序列
    left = arr[start: m + 1]
    right = arr[m + 1: end + 1]

    # 滑动指针,对比left 和 right两个子序列
    l_index, r_index = 0, 0
    while l_index < len(left) and r_index < len(right):
        if left[l_index] > right[r_index]:
            arr[start] = left[l_index]
            l_index += 1
        else:
            arr[start] = right[r_index]
            r_index += 1

        start += 1

    # 对没有滑动完的序列进行赋值处理
    if l_index == len(left):
        arr[start: end + 1] = right[r_index: len(right)]
    else:
        arr[start: end + 1] = left[l_index: len(left)]


def merge_sort(arr, start, end):
    m = int((start + end) / 2)

    if start < end:
        merge_sort(arr, start, m)
        merge_sort(arr, m + 1, end)

        merge_subsequence(arr, start, m, end)


arr = [3, 44, 38, 5, 47, 38, 36, 26, -7, 2, 46, 4, 19, 50]
merge_sort(arr, 0, len(arr) - 1)
print(arr)

[50, 47, 46, 44, 38, 38, 36, 26, 19, 5, 4, 3, 2, -7]

你可能感兴趣的:(数据结构与算法)