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实现的主要内容,如果未能解决你的问题,请参考以下文章