mergeSort算法的Python实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mergeSort算法的Python实现相关的知识,希望对你有一定的参考价值。

我遇到了mergeSort算法的以下实现:

def merge_sort(x):
    merge_sort2(x,0,len(x)-1)


def merge_sort2(x,first,last):
    if first < last:
        middle = (first + last) // 2
        merge_sort2(x,first,middle)
        merge_sort2(x,middle+1,last)
        merge(x,first,middle,last)


def merge(x,first,middle,last):
    L = x[first:middle+1]
    R = x[middle+1:last+1]
    L.append(999999999)
    R.append(999999999)
    i=j=0
    for k in range(first,last+1):
        if L[i] <= R[j]:
            x[k] = L[i]
            i += 1
        else:
            x[k] = R[j]
            j += 1


x = [17, 87, 6, 22, 41, 3, 13, 54]
x_sorted = merge_sort(x)
print(x)

我得到了大部分。但是,我不理解的是合并功能的以下四行:

 L = x[first:middle+1]
    R = x[middle+1:last+1]
    L.append(999999999)
    R.append(999999999)

首先:为什么切片以middle + 1结尾?在Python中切片数组包括最后一个元素,对吗?因此,从first:middle切片是否足够?那么,+ 1有什么用?其次:为什么我必须将大量数字附加到列表中?为什么没有它就不起作用?没有,我检查了一下。但是我只是不知道为什么。

答案

您实际上并不需要意大利面条式的嵌套函数,只需从https://rosettacode.org/wiki/Sorting_algorithms/Merge_sort#Python中重复出现就可以了>

from heapq import merge

def merge_sort(m):
    if len(m) <= 1:
        return m

    middle = len(m) // 2
    left = m[:middle]
    right = m[middle:]

    left = merge_sort(left)
    right = merge_sort(right)
    return list(merge(left, right))

索引不应该为+1,因为Python切片在相同索引的情况下不会重叠,即。

>>> x = [1,2,3,4,5,6]
>>> middle = 4
>>> x[:middle]
[1, 2, 3, 4]
>>> x[middle:]
[5, 6]

此外,heapq合并的实现要比您可以编写的代码更理想=)

另一答案

Q1:在Python中切片数组包括最后一个元素,对吧?

以上是关于mergeSort算法的Python实现的主要内容,如果未能解决你的问题,请参考以下文章

快速排序(QuickSort),归并排序(MergeSort),堆排序(HeapSort)典型C++代码实现总结

Python 实现排序算法

归并排序详解(MergeSort)递归和非递归实现

算法导论之所有排序算法的Python实现

重学数据结构和算法之归并排序快速排序

什么是归并排序 mergeSort