2014-01-23 4 views
0

я должен реализовать пузырьковой сортировки в качестве домашнего задания и мой питон скрипт для поиска параметров командной строки 2:пузырьковой сортировки в Python не сортировать правильно

-f, который указывает путь к файлу входного файла, который содержит число в каждой строке, которую я должен сортировать, используя сортировку пузырьков;

-p что, если указано, сообщает сценарию распечатать отсортированный список чисел в командной строке.

Кроме того, я должен реализовать алгоритм in situ, что означает, что я должен использовать только один список/массив/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:]) 

У меня возникли 2 проблемы с моим сценарием:

во-первых, если я не указать параметр -f, то сценарий не работает использование функции() , он только сообщает «Нет такого файла или каталога:». Почему мой скрипт не использует функцию use()?

Кроме того, алгоритм сортировки пузырьков не работает должным образом. Если я запустил сценарий, цифры не отсортированы должным образом. Я могу, например, увидеть 3998 до 403 в списке. Но я заметил, что числа ARE отсортированы, но только слева от цифр. Например, я вижу 2553, 256, 2562. 256 явно не больше 2553, но если вы берете число слева, третий символ слева, 6, больше, чем третий символ слева от 2553 , который равен 5.

Как я могу решить эти две проблемы?

Благодарим за помощь.

+0

Во-первых, есть причина, по которой вы используете 'getopt'? [Документы] (http://docs.python.org/3/library/getopt.html) явно говорят, что «Пользователи, которые не знакомы с функцией' '' '' '' '' '' '' '' '' '' 'или кто хотел бы написать меньше кода и получите более эффективную помощь и сообщения об ошибках, вместо этого следует рассмотреть возможность использования модуля 'argparse'. Вы, очевидно, не старая рука с C 'getopt', так почему бы вам использовать этот загадочный модуль C-стиля в Python вместо того, который он рекомендует? – abarnert

+0

Во-вторых, не ставьте две совершенно отдельные проблемы вместе в один вопрос. Выберите один и спросите об этом. Или, еще лучше, просто опубликуйте два отдельных вопроса. (Вы можете добавить ссылки между ними, чтобы было очевидно, что они похожи на один и тот же код.) Вы получите более качественные ответы и дважды повторите загрузку. – abarnert

+0

Наконец, пожалуйста, попытайтесь уменьшить то, что вы публикуете, в [Минимальный, Полный, Действительный пример] (http://stackoverflow.com/help/mcve), который содержит достаточно кода, чтобы показать проблему, которую вы хотите исправить, а не всю вашу программу , – abarnert

ответ

5

Во-первых, если я не укажу параметр -f, сценарий никогда не запускает функцию usage(), он сообщает только «Нет такого файла или каталога:». Почему мой скрипт не использует функцию use()?

getopt() не знает, какие флаги необходимы и которые являются необязательными. Он просто проверяет, что вы не передаете неопределенные флаги или опускаете аргумент, если для флага требуется один с :.

Вам необходимо пройти проверку, что -f был отправлен, если требуется.


Кроме того, алгоритм пузырьковой сортировки, кажется, не работает должным образом. Если я запустил сценарий, цифры не отсортированы должным образом. Я могу, например, увидеть 3998 до 403 в списке. Но я заметил, что числа ARE отсортированы, но только слева от цифр.

Это потому, что ваш код фактически сортирует строки, а не цифры, поэтому он помещает их в lexicographic order.Попробуйте преобразовать их в числа, когда вы читаете файл:

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

Кроме того, я должен реализовать алгоритм на месте, что означает, что я должен использовать только один список/массив/и т.д. без выделения какого-либо другого временного списка/массива/etc или переменной для хранения одной или части всех чисел для сортировки в алгоритме.

В этом случае я бы рекомендовал удалить оператор return из функции сортировки пузырьков. Лучший способ показать, что вы используете только один массив, - это не создать вторую переменную с именем sortedList.

bubble(unsortedList) 

Если ваш вызов сортировки пузыря - это просто, что без назначения, тогда ясно, что вы должны изменить исходный массив.

+0

Большое спасибо за вашу помощь! – Choub890

+0

+1 для последнего раздела о возврате 'None' из функции in-situ, как и в стандартном' list.sort'. (Ну, не +1, потому что я уже дал вам +1 и не могу дать вам больше, но вы знаете, что я имею в виду.) – abarnert

Смежные вопросы