繁体   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