簡體   English   中英

Python 冒泡排序僅在大數字時中斷

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM