合并排序实现由于变量的存储方式而存在困难 我有一些C++和Python的经验,但肯定是我一直在苦苦挣扎。我得到了合并排序的概念,但我不理解Python如何存储这些值。为了将这个怪物分割成更小的碎片,我只专注于排序[11,26,9]
更具体地说,在下面的输出中,这一行之后会发生什么: 第二个while循环之前的1 1 2(i j k)?Python执行哪个循环以到达附加输出的最后一行?我的主要困惑在于[11]最终是在9点到26点之间。是哪个回路引起的合并排序实现由于变量的存储方式而存在困难 我有一些C++和Python的经验,但肯定是我一直在苦苦挣扎。我得到了合并排序的概念,但我不理解Python如何存储这些值。为了将这个怪物分割成更小的碎片,我只专注于排序[11,26,9],python,arrays,sorting,merge,mergesort,Python,Arrays,Sorting,Merge,Mergesort,更具体地说,在下面的输出中,这一行之后会发生什么: 第二个while循环之前的1 1 2(i j k)?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] myL
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;
导入scipy.io作为sio,数学作为m,numpy作为np,sympy作为sym,scipy作为sp
def合并排序(myList):
如果len(myList)>1:
mid=len(myList)//2
左=我的列表[:中]
打印(左,“左”)
右=myList[中间:]
打印(右,“右”)
打印(myList,“除以2后的myList”)
合并排序(左)
合并排序(右)
i、 j,k=0,0,0
而i
我不确定我是否完全理解您的问题,因此如果我的回答不满足您的问题,请纠正我
调用mergeSort()时,长度为3,因此输入分为左[11]和右[26,9]。此拆分不会以任何方式影响输入myList[11,26,9]
在内部调用mergesort之后,left仍然是[11],但right被更改为[9,26]
然后,第一个while循环用9覆盖myList中的第一个值。在第二次迭代中,它用11覆盖myList的第二个值。左派和右派都不受此影响,因此他们仍然是左派[11]和右派[9,26]。(i,j,k)现在是(1,1,2),因此第一个while循环结束
第二个while循环被跳过,因此没有任何更改
在第三个循环中,myList的剩余第三个值被右侧第二个点的值26覆盖
这将结束mySort(…)的原始调用,在此调用之外,可以使用修改后的列表
这能满足你的问题吗
注:我知道这不是你的目标,但由于python不是一种性能良好的语言,请尝试使用内置函数或库,由于它们大多数是用C/C++编译的,因此比自实现版本快得多:)如果返回新的排序列表而不是更改传入列表,可能更容易理解…?如果有兴趣,我可以添加一个答案,显示Python中优化的自上而下的合并排序,它使用一对相互递归的函数根据递归级别更改合并方向。请注意,Python版本是50到100倍的速度,与C/C++中的相同逻辑一样慢。我知道Python比C++更棒,它显示了像我这样的新手的所有步骤。谢谢提问者试图编辑一个回答。此处输入:
谢谢您的帮助!下面是我的输出。我不确定在这一行之后到底发生了什么:在第二个while循环之前的12(I j k)。Python是如何执行以9和26结尾的代码的代码>就像我在答案中写的,11已经在第一个while循环完成后的第二个位置。如果您将print(myList,“myList at if”)
语句下移到赋值myList[k]=left[i]
下面,您就可以明白我的意思了,这与print(myList,“myList at if”)无关。见我原来的帖子,输出。我排在那一行:[9,26,9]我的列表在if;不管怎样,我非常感谢你努力帮助我。毫无疑问!是的,但是在print后面的行中,11被插入变量mylist
中,您在那里的输出包含whileloop中if之前的状态,因此输出错过了11的插入
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)