Как я могу изменить свою программу для сортировки списка в порядке убывания, изменив ОДИН оператор? - PullRequest
0 голосов
/ 22 мая 2018

Итак, у меня есть этот алгоритм пузырьковой сортировки, который работал только в порядке возрастания , поэтому я пытаюсь адаптировать программу, передавая 'возрастанию' или 'убыванию' в качестве параметра функции, которая изменит оператор с «>» на «<» при сравнении соседних элементов в списке.Я пробовал это, у кого-нибудь есть идеи?Я хотел бы сохранить код в том виде, как он есть, и попытаться, а не добавлять оператор if, который повторяет весь код для каждого условия. </p>

array=[5,7,0,4,3,24,-1,83,2,1]

def BubbleSort(alist, order):
    position=0
    swapmade=True
    if order == 'ascending':
        symbol = '>'
    elif order == 'descending':
        symbol = '<'
    while swapmade == True:
        swapmade=False
        for count in range(len(alist)-1):
            LB=alist[position]
            UB=alist[position+1]
            if alist[position] + symbol + alist[position+1]:
                LB,UB=UB,LB
                alist.remove(alist[position+1])
                alist.insert(position, LB)
                swapmade=True
            position=position+1
            if position+1 == len(alist):
                position=0
    return alist

result = BubbleSort(array, 'ascending')
print(*result)

Ответы [ 2 ]

0 голосов
/ 22 мая 2018

Поскольку вы хотели сохранить имеющийся у вас код, вы можете использовать модуль оператора для сопоставления оператора с переменной.

Поэтому вместо установки symbol в "<" или "> ", вы можете сделать это (где gt больше чем, а lt меньше чем)

import operator
if order == 'ascending':
    op = operator.gt
elif order == 'descending':
    op = operator.lt

и это

if op(alist[position], alist[position + 1]):
    LB, UB = UB, LB
    alist.remove(alist[position + 1])
    alist.insert(position, LB)
    swapmade = True
0 голосов
/ 22 мая 2018

Я вижу несколько способов сделать то, что вы хотите.

Одним из способов является определение функции сравнения, которая зависит от параметра.В начале вашей функции подкачки определите

comparefunc = (lambda x,y: x < y) if order == 'ascending' else (lambda x,y: x < y)

. Затем используйте оператор

if comparefunc(alist[position], alist[position+1]):

. Вариант заключается в использовании предопределенных функций сравнения gt и lt изМодуль operator (как в комментарии @ zvone), а не функции lambda, которые я использовал, если вы хотите импортировать этот модуль.

Поскольку вы сортируете целые числа, другим способом является сравнение отрицательных значенийзначения, если сортировка должна быть убывающей.Я оставлю вас, чтобы выяснить эту кодировку.

...