[英]Python: While printing the result of merge sort function, print option gives all steps. How to print only final sorted array?
這是必須返回新排序列表的函數的代碼,我如何只打印最后的 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)
我建議您不要在排序功能中打印。
排序函數應該只是排序而不做任何其他事情。 這始終是一種很好的做法,但對於遞歸函數尤其重要。 如果要打印,對數據進行排序,在sort函數之外進行打印。
我一般建議將數據處理和數據輸出/數據呈現分開。 這使您永遠不會更改排序功能,而是以一種或另一種格式打印結果或將結果寫入文件,....
只需將打印行替換為
return arr
此外,您的函數似乎不應修改輸入數組。 因此,我建議進行以下更改:將開頭的 arr= arr=list_to_sort
更改為arr=list_to_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
進行(淺)復制使用
array2 = array1[:]
下面一行創建了一個新對象,它與舊對象同名,舊對象沒有被修改。
array1 = array1[:10]
要就地更改 array1,請執行
array1[:] = array1[:10]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.