![](/img/trans.png)
[英]Bubble Sort working, but switching back the first 2 numbers, and only with certain numbers
[英]Python bubble sort breaks with large numbers only
我試圖創建一個冒泡排序測試算法,該算法生成 x 數量的隨機整數並輸出到控制台和文本文件。 創建的數字數量以及隨機整數的最大值由變量bigsize 確定。 當大尺寸約為 2300 時,代碼似乎可以正常工作,有時更多,有時更少。 不過,我總是可以得到 2000 工作。
編輯:另外值得注意的是,似乎代碼在排序過程中中斷,因為我得到一個文件到 output 未排序的數字沒有問題。
import random
import sys
bigsize = 2000
def main():
sys.setrecursionlimit(7000)
array = create_list()
print_array(array)
bubble_sort(array)
display_out(array)
def create_list():
array = [0] * bigsize
for x in range(bigsize):
array[x] = random.randint(0, bigsize)
return array
def bubble_sort(array):
increment = 0
buffer = 0
for x in range(len(array) - 1):
if (array[increment + 1] <= array[increment]):
buffer = array[increment + 1]
array[increment + 1] = array[increment]
array[increment] = buffer
increment = increment + 1
increment = 0
for x in range(len(array) - 1):
if (array[increment + 1] >= array[increment]):
increment = increment + 1
elif (array[increment + 1] < array[increment]):
bubble_sort(array)
def display_out(array):
for x in range(bigsize):
print(array[x])
main()
你有一種功能失調的類型。 首先,遞歸沒有任何用處:您不會減少任務——您只需使用遞歸代替排序的外循環。 那時,您錯誤地實現了它。 我強烈建議您在處理遞歸之前多練習更多基本的編程技能。
第一個(非)問題是一個簡單的低效率:您的循環以x
作為索引,但循環體忽略x
,而它保持具有相同 value 的increment
。 沒有理由有兩個單獨的變量。 您可以在 web 的幾乎所有冒泡排序中看到它是如何使用的:
for pos in range(len(array) - 1):
if array[pos+1] < array[pos]:
# switch the elements
您在第二個循環中有類似的低效率:
increment = 0
for x in range(len(array) - 1):
if (array[increment + 1] >= array[increment]):
increment = increment + 1
同樣,您忽略x
並將increment
保持在相同的值......直到您發現元素亂序:
elif (array[increment + 1] < array[increment]):
bubble_sort(array)
當你這樣做時,你會重復,但不會改變increment
。 當你從這個遞歸返回時,數組必須被正確排序(假設遞歸邏輯是正確的),然后你繼續這個循環,遍歷現在排序的數組,確保數組在bigsize
下是有序的.
整個循環很愚蠢:如果您在第一個循環中進行切換時只需設置一個標志,您就會知道是否需要再次排序。 您將進行一次額外的迭代,但這不會影響時間復雜度。 例如:
done = True
for pos in range(len(array) - 1):
if array[pos+1] < array[pos]:
array[pos], array[pos+1] = array[pos+1], array[pos]
# Replace the second loop entirely
if not done:
bubble_sort(array)
我強烈建議您通過正確跟蹤結果來檢查程序的運行情況。 然而,首先,清理邏輯。 刪除(暫時)寫入文件的多余代碼,放入一些基本的跟蹤print
語句,並研究現有的冒泡排序,看看你在哪里讓這一切變得過於“羅嗦”。 事實上,刪除遞歸並簡單地重復排序直到done
。
當我嘗試使用bigsize=5000
時,它會重復到 3818 級別並退出。 如果您清理程序后問題仍然存在,我將把跟蹤留給您。 在您收緊邏輯並跟蹤操作之前,修復“無聲的死亡”沒有多大意義,這樣您就知道您正在修復一個原本可以工作的程序。 正如發布指南所說,當前的代碼並沒有“讓其他人更容易幫助你”。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.