【问题标题】:Bubble sort in Python not sorting properlyPython中的冒泡排序没有正确排序
【发布时间】:2014-02-13 09:27:06
【问题描述】:

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

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

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

另外,我必须实现算法原位,这意味着我必须只使用一个列表/数组/等,而无需分配任何其他临时列表/数组/等或变量来保存一个或算法中要排序的所有数字的一部分。因此,在我的脚本中,我只使用 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:])

我的脚本有 2 个问题:

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

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

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

感谢您的帮助。

【问题讨论】:

  • 首先,您使用getopt 有什么原因吗? The docs 明确表示,“不熟悉 C getopt() 函数或希望编写更少代码并获得更好帮助和错误消息的用户应考虑改用 argparse 模块。”你显然不是 C getopt 的老手,那么你为什么要在 Python 中使用这个神秘的 C 风格模块而不是它推荐的模块呢?
  • 第二,不要将两个完全独立的问题放在一个问题中。挑一个然后问这个。或者,更好的是,只需发布​​两个单独的问题。 (您可以在它们两者之间添加链接,以使它们明显是相同的代码。)您将获得更好的答案,并且启动次数增加一倍。
  • 最后,请尽量减少您发布到 Minimal, Complete, Valid Example 的内容,其中包含足够的代码来显示您想要解决的问题,而不是您的整个程序。
  • 我使用 getOpt 的原因是因为这是我在网上看到的内容。我是 Python 新手,我认为这是我必须用来检查参数和标志的东西。感谢您将 argparse 模块指向我,我会看看。
  • 一般来说,每当您使用 Python 标准库模块时,至少浏览一下文档。他们通常有很好的简短解释或很好的例子——这也是你在使用有更好替代品的东西时发现的方法。

标签: python algorithm sorting bubble-sort


【解决方案1】:

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

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

如果需要,您可以检查是否传入了 -f


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

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

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

另外,我必须实现算法原位,这意味着我必须只使用一个列表/数组/等,而无需分配任何其他临时列表/数组/等或变量来保存一个或算法中要排序的所有数字的一部分。

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

bubble(unsortedList)

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

【讨论】:

  • 非常感谢您的帮助!
  • +1 表示关于从原位函数返回 None 的最后一部分,就像标准的 list.sort。 (好吧,不是 +1,因为我已经给了你 +1 并且不能给你更多,但你知道我的意思。)
猜你喜欢
  • 2020-05-24
  • 1970-01-01
  • 2021-12-15
  • 2018-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多