Python中的冒泡排序没有正确排序

时间:2014-01-23 01:58:28

标签: python algorithm sorting bubble-sort

我必须实现冒泡排序作为家庭作业,我的python脚本必须查找2个命令行参数:

-f指定输入文件的文件路径,该文件路径包含每行必须使用冒泡排序排序的数字;

-p,如果指定,则告诉脚本在命令行中打印已排序的数字列表。

另外,我必须实现 in situ 算法,这意味着我必须只使用一个list / array / etc而不分配任何其他临时列表/数组/ etc或变量来保存一个或者算法中排序的所有数字的一部分。所以,在我的脚本中,我只使用 unsortedList 而没有别的东西来保存要排序的数字。我从以下链接中采用了冒泡排序算法:Bubble Sort Homework

这是我的剧本:

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:])

我的剧本有两个问题:

首先,如果我没有指定-f参数,脚本永远不会运行usage()函数,它只会告诉“没有这样的文件或目录:''”。为什么我的脚本不运行usage()函数?

此外,冒泡排序算法似乎无法正常工作。如果我运行脚本,则数字排序不正确。例如,我可以在列表中的403之前看到3998。但是,我注意到数字是排序的,但只是从数字的左边开始。例如,我可以看到2553,256,2562。256显然不大于2553,但是如果你从左边取数字,左边的第三个字符6比2553左边的第三个字符大,这是5。

我该如何解决这两个问题?

感谢您的帮助。

1 个答案:

答案 0 :(得分:5)

  

首先,如果我没有指定-f参数,脚本永远不会运行usage()函数,它只会告诉“没有这样的文件或目录:''”。为什么我的脚本不运行usage()函数?

getopt()不知道哪些标志是必需的,哪些是可选的。它只是检查你没有传递未指定的标志,或者如果一个标志需要一个带有:的标志,则会省略一个参数。

如果您需要,请检查-f是否已被传入。


  

此外,冒泡排序算法似乎无法正常工作。如果我运行脚本,则数字排序不正确。例如,我可以在列表中的403之前看到3998。但是,我注意到数字已经排序,但只是从数字的左边开始。

那是因为你的代码实际上是对字符串而不是数字进行排序,所以它将它们放在lexicographic order中。在您阅读文件时尝试将它们转换为数字:

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

  

另外,我必须实现 in situ 算法,这意味着我必须只使用一个list / array / etc而不分配任何其他临时列表/数组/ etc或变量来保存一个或者算法中所有数字的一部分。

在这种情况下,我建议从冒泡排序功能中删除return语句。显示您只使用一个数组的最佳方法是不创建名为sortedList的第二个变量。

bubble(unsortedList)

如果您的冒泡排序调用只是那个,没有赋值,那么很明显您必须修改原始数组。