【发布时间】:2019-12-17 10:29:16
【问题描述】:
我遇到了以下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 有什么用呢? 其次:为什么我必须将巨大的数字附加到列表中?为什么没有它就行不通?没有,我查过了但我就是不知道为什么。
【问题讨论】:
-
在 Python 中对数组进行切片包括最后一个元素,对吗? – 否:
'asdf'[:2] → 'as';'asdf'[2] → 'd'. -
也许这个algo 更清楚
-
我猜这个巨大的数字应该是“比任何其他数字都大”,这当然不是真的。
-
我至少可以帮助你解决你的一个问题......最后的大数字是让算法知道已经到达一侧的末端。这意味着在那之后只有来自另一侧的元素被插入到 x 中。为了使算法尽可能简单,插入这些大数字。另请注意,您现在不需要进行一次比较,因为您无需检查是否已到达列表末尾
-
@Cedced_Bro:索引为 k 的 for 循环怎么样?这不应该确保我只根据需要频繁地遍历循环吗?另外:大数字实际上是 L 和 R 的一部分。因此,对于该条目,R[i]