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