Python:打印合并排序函数的结果时,打印选项给出了所有步骤。如何仅打印最终排序的数组?

Python:打印合并排序函数的结果时,打印选项给出了所有步骤。如何仅打印最终排序的数组?,python,Python,下面是函数的代码,该函数必须返回新的排序列表,如何只打印最终的arr,因为它打印所有步骤 def mergeSort(list_to_sort, ascend=True): arr=list_to_sort if len(arr) > 1: mid = len(arr) // 2 left = arr[:mid] right = arr[mid:] # Recursive call on each half

下面是函数的代码,该函数必须返回新的排序列表,如何只打印最终的arr,因为它打印所有步骤

def mergeSort(list_to_sort, ascend=True):
    arr=list_to_sort

    if len(arr) > 1:
        mid = len(arr) // 2
        left = arr[:mid]
        right = arr[mid:]

        # Recursive call on each half
        mergeSort(left)
        mergeSort(right)

        # Two iterators for traversing the two halves
        i = 0
        j = 0

        # Iterator for the main list
        k = 0

        while i < len(left) and j < len(right):
            if left[i] < right[j]:
                # The value from the left half has been used
                arr[k] = left[i]
                # Move the iterator forward
                i += 1
            else:
                arr[k] = right[j]
                j += 1
            # Move to the next slot
            k += 1

        # For all the remaining values
        while i < len(left):
            arr[k] = left[i]
            i += 1
            k += 1

        while j < len(right):
            arr[k] = right[j]
            j += 1
            k += 1

        if ascend:
            pass
        else:
            arr = arr[::-1]

    print(arr)

mergeSort([54, 26, 93, 17, 77, 31, 44, 55, 20],False)
def mergeSort(列表到排序,升序=真):
arr=列表到排序
如果len(arr)>1:
mid=len(arr)//2
左=arr[:中]
右=arr[中间:]
#对每一半的递归调用
合并排序(左)
合并排序(右)
#两个用于遍历两部分的迭代器
i=0
j=0
#主列表的迭代器
k=0
而i
我建议您不要在排序功能中打印

排序函数应该只进行排序,而不执行其他操作。这始终是一个很好的实践,但对于递归函数尤其重要。 如果要打印,请对数据进行排序,并在排序功能之外打印

I概述建议将数据处理和数据输出/数据表示分开。这允许您永远不更改排序函数,而是以一种或另一种格式打印结果或将结果写入文件

只需将打印行替换为

return arr
同样,您的函数似乎不应该修改输入数组。 因此,我建议进行以下修改: 改变
arr=list\u to\u sort
开头的
arr=list\u to\u sort[:]
这将创建一个副本,因此对
arr
的修改不会修改输入列表

但是,如果您这样做,您还必须更改:

    if len(arr) > 1:
        mid = len(arr) // 2
        left = arr[:mid]
        right = arr[mid:]

        # Recursive call on each half
        mergeSort(left)
        mergeSort(right)
差不多

    if len(arr) > 1:
        mid = len(arr) // 2
        # Recursive call on each half
        left = mergeSort(arr[:mid])
        right = mergeSort(arr[mid:])
您必须这样做,因为您的排序函数不是就地排序,而是返回排序结果

并将调用函数的代码更改为

tosort = [54, 26, 93, 17, 77, 31, 44, 55, 20]
print("tosort before sorting =", tosort)
sorted_data = mergeSort(tosort, False)
print("tosort after sorting =", tosort)
print("sorted_data =", sorted_data)
This allows you to verify, that your input data is not modified, but your output data is.
这些命令将创建以下输出:

tosort before sorting = [54, 26, 93, 17, 77, 31, 44, 55, 20]
tosort after sorting = [54, 26, 93, 17, 77, 31, 44, 55, 20]
sorted_data = [93, 77, 55, 54, 44, 31, 26, 20, 17]

您可以看到,输入数据不再被修改,但结果被排序

还有两个技巧,在处理列表和决定是否要复制列表或进行就地修改时可能会派上用场

线路

array2 = array1  
不复制同一数组的两个不同名称。如果您更改
array1
您将更改
array2

使(浅)复制使用

下一行创建一个新对象,该对象的名称与旧对象的名称相同,但不修改旧对象

array1 = array1[:10]
要更改阵列1,请执行以下操作

array1[:] = array1[:10]

我试图更正格式,但包含了代码的前几行和最后一行,但堆栈溢出阻止了它,因为代码与注释的比率。@LhasaDad我有一个正在进行的编辑请求来修复格式。不幸的是,部分要求是函数本身返回一个排序的列表哦,我看到了返回已排序的列表可能并不意味着您应该打印它。这意味着,你应该归还它。我将修改我的答案。请说明是否允许您的mergeSort函数更改传入数据,或者它是否应保持传入数据不变,并仅返回已排序的版本。因此,它的行为应该类似于python的
sorted
,或者类似于
list.sort()
一个排序到位,另一个创建一个已排序的副本并保留原始副本。请指定,我可以相应地修改您的代码(或告诉您要更改的行),您当前的解决方案也会对输入数组进行排序。该函数必须返回一个新的排序列表,以便更容易理解,我将发布赋值:算法实现:为上述算法编写方法,称为(list_to_sort,ascend=True)-“algo名称”可以采用上面粗体显示的名称。-“ascend”参数表示排序顺序是升序还是降序。-这些方法返回一个新的排序列表(否则可能会扭曲结果)。例如,冒泡([4,3,7,1],False)将使用冒泡排序算法返回[7,4,3,1]在同一ex1.py文件OK中包含所有3种方法,因此可能不应修改输入数据。最快的方法是将行
arr=list\u to\u sort
替换为
arr=list\u to\u sort[:]
更改函数中的递归调用。我会修改我的答案
array1[:] = array1[:10]