Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
合并排序实现由于变量的存储方式而存在困难 我有一些C++和Python的经验,但肯定是我一直在苦苦挣扎。我得到了合并排序的概念,但我不理解Python如何存储这些值。为了将这个怪物分割成更小的碎片,我只专注于排序[11,26,9]_Python_Arrays_Sorting_Merge_Mergesort - Fatal编程技术网

合并排序实现由于变量的存储方式而存在困难 我有一些C++和Python的经验,但肯定是我一直在苦苦挣扎。我得到了合并排序的概念,但我不理解Python如何存储这些值。为了将这个怪物分割成更小的碎片,我只专注于排序[11,26,9]

合并排序实现由于变量的存储方式而存在困难 我有一些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

更具体地说,在下面的输出中,这一行之后会发生什么: 第二个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] 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)