【发布时间】:2020-12-17 16:10:26
【问题描述】:
我有一些 C++ 和 Python 经验,但我肯定一直在努力解决这个问题。我得到了合并排序的概念,但我不明白 Python 如何存储这些值。我只专注于对[11, 26, 9] 进行排序,以便将这个怪物分成更小的部分。
更具体地说,在下面的输出中,这行之后会发生什么: 1 1 2 (i j k) 在第二个 while 循环之前? Python 执行哪个循环以到达附加输出的最后一行?我的主要困惑是关于 [11] 最终在 9 到 26 之间。哪个循环确实导致了这种情况?
OUTPUT:
[11, 26, 9] left;
[15, 17, 77] right;
[11, 26, 9, 15, 17, 77] myList after dividing by 2;
[11] left;
[26, 9] right;
[11, 26, 9] myList after dividing by 2;
[26] left;
[9] right;
[26, 9] myList after dividing by 2;
[26] left;
[9] right;
[26, 9] myList at zero;
1 length of right;
1 length of left;
0 0 0 (i j k) before if loop;
[9, 9] myList at else;
[26] left before 2nd while loop;
[9] right before 2nd while loop;
0 1 1 (i j k) before 2nd while loop;
[9, 26] myList 2nd while loop i;
[11] left;
[9, 26] right;
[11, 26, 9] myList at zero;
2 length of right;
1 length of left;
0 0 0 (i j k) before if loop;
[9, 26, 9] myList at else;
[11] left;
[9, 26] right;
[9, 26, 9] myList at zero;
2 length of right;
1 length of left;
0 1 1 (i j k) before if loop;
[9, 26, 9] myList at if;
[11] left before 2nd while loop;
[9, 26] right before 2nd while loop;
1 1 2 (i j k) before 2nd while loop;//WHAT HAPPENS HERE NEXT WITH [11]?
[11] left after 2nd while loop j;
[9, 26] right after 2nd while loop j;
[9, 11, 26] myList 2nd while loop j;
import scipy.io as sio, math as m, numpy as np, sympy as sym, scipy as sp
def mergeSort(myList):
if len(myList) > 1:
mid = len(myList) // 2
left = myList[:mid]
print(left, "left")
right = myList[mid:]
print(right, "right")
print(myList, "myList after dividing by 2")
mergeSort(left)
mergeSort(right)
i, j, k = 0, 0, 0
while i < len(left) and j < len(right):
print(left, "left")
print(right,"right")
print(myList, "myList at zero")
print(len(right), "length of right")
print(len(left), "length of left")
print(i, j, k, "(i j k) before if loop")
# ---------------------------------------------------------------------
if left[i] < right[j]:
print(myList, "myList at if")
myList[k] = left[i]
i += 1
else:
myList[k] = right[j]
print(myList, "myList at else")
j += 1
k += 1
# -------------------------------------------------------------------------
print(left, "left before 2nd while loop")
print(right, "right before 2nd while loop")
print(i, j, k, " (i j k) before 2nd while loop")
# ------------------------------------------------------------------------
while i < len(left):
myList[k] = left[i]
i += 1
k += 1
print(myList, "myList 2nd while loop i")
while j < len(right):
myList[k] = right[j]
j += 1
k += 1
print(left, "left after 2nd while loop j")
print(right, "right after 2nd while loop j")
print(myList, "myList 2nd while loop j")
myList = [11,26,9,15,17,77]
mergeSort(myList)
print(myList)
【问题讨论】:
-
如果你返回一个新的排序列表而不是改变传入的列表可能更容易理解...?
-
如果有兴趣,我可以添加一个答案,显示 Python 中优化的自上而下的合并排序,它使用一对相互递归的函数来根据递归级别更改合并的方向。请注意,Python 版本的速度是 C/C++ 中相同逻辑的 50 到 100 倍以上。
-
好吧,我想看看代码到底发生了什么。我比 C++ 更了解 Python,而且通过显示像我这样的新手的所有步骤,它似乎对用户更友好。谢谢!
标签: python arrays sorting merge mergesort