簡體   English   中英

Python中的冒泡排序未正確排序

[英]Bubble sort in Python not sorting properly

我必須將氣泡排序作為一項家庭作業來實現,而我的python腳本必須查找2個命令行參數:

-f指定輸入文件的文件路徑,該文件路徑的每一行都包含一個數字,我必須使用冒泡排序對其進行排序;

-p,如果指定,則告訴腳本在命令行中打印數字的排序列表。

另外,我必須在原位實現算法,這意味着我只需要使用一個列表/數組/等,而無需分配任何其他臨時列表/數組/等或變量來容納所有數字中的一個或一部分以進行排序。算法。 因此,在我的腳本中,我只使用unsortedList,而沒有其他東西來保存要排序的數字。 我從以下鏈接中獲取了冒泡排序算法: 冒泡排序作業

這是我的腳本:

import sys, getopt

def main(argv):
    inputFilePath = ""
    printList = False

    # Traitement pour parser les arguments
    try:
        opts, args = getopt.getopt(argv, "f:p")
    except getopt.GetoptError:
        usage()
        sys.exit()
    for opt, arg in opts:
        if opt in ("-f"):
            inputFilePath = arg
        if opt in ("-p"):
            printList = True

    inputFile = open(inputFilePath, "r")
    unsortedList = [line.rstrip('\n') for line in inputFile]

    sortedList = bubble(unsortedList)
    if printList == True:
        print (sortedList)

def usage():
    print ("""
    Usage: bubble.py -f <filepath> -p
           -f <filepath> [REQUIRED]: specifies the filepath of the input file
           -p            [OPTIONAL]: specifies whether to print the sorted list or not
    """)

# Function found at https://stackoverflow.com/questions/895371/bubble-sort-homework
def bubble(unsortedList):
    length = len(unsortedList) - 1
    isSorted = False

    while not isSorted:
        isSorted = True
        for i in range(length):
            if unsortedList[i] > unsortedList[i+1]:
                isSorted = False
                unsortedList[i], unsortedList[i+1] = unsortedList[i+1], unsortedList[i]

    return unsortedList

if __name__ == "__main__":
    main(sys.argv[1:])

我的腳本有2個問題:

首先,如果我未指定-f參數,該腳本將永遠不會運行usage()函數,它只會告訴“沒有這樣的文件或目錄:”。 為什么我的腳本沒有運行usage()函數?

而且,冒泡排序算法似乎無法正常工作。 如果我運行腳本,則數字排序不正確。 例如,我可以在列表中的403之前看到3998。 但是,我注意到數字是排序的,但僅從數字的左側開始。 例如,我可以看到2553、256、2562。256顯然不大於2553,但是如果您從左邊算起數字,則左邊第三個字符6大於2553左邊的第三個字符,即5。

我該如何解決這兩個問題?

謝謝你的幫助。

首先,如果我未指定-f參數,該腳本將永遠不會運行usage()函數,它只會告訴“沒有這樣的文件或目錄:”。 為什么我的腳本沒有運行usage()函數?

getopt()不知道哪些標志是必需的,哪些標志是可選的。 它僅檢查您是否未傳遞未指定的標志,或者如果標志需要以下參數,則忽略該參數:

如果需要,您可以檢查是否傳入了-f


而且,冒泡排序算法似乎無法正常工作。 如果我運行腳本,則數字排序不正確。 例如,我可以在列表中的403之前看到3998。 但是,我注意到數字是排序的,但僅從數字的左側開始。

那是因為您的代碼實際上是在對字符串而不是數字進行排序,因此會將它們按字典順序排列 讀取以下文件時,請嘗試將它們轉換為數字:

unsortedList = [int(line.rstrip('\n')) for line in inputFile]
                ^^^^                 ^

另外,我必須在原位實現算法,這意味着我只需要使用一個列表/數組/等,而無需分配任何其他臨時列表/數組/等或變量來容納所有數字中的一個或一部分以進行排序。算法。

在這種情況下,建議您從冒泡排序功能中刪除return語句。 顯示僅使用一個數組的最好方法是不創建另一個名為sortedList變量。

bubble(unsortedList)

如果您的冒泡排序調用只是沒有分配的那個,那么很明顯您必須修改原始數組。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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