Как добавить обратную функцию для алгоритма сортировки пузырьков в python - PullRequest
0 голосов
/ 06 октября 2019

В настоящее время я пытаюсь добавить функцию реверса к алгоритму сортировки пузырьков.

Это мое текущее состояние:

_bubble_sort(self, reverse=False):
    lst = list(self.unsorted_tuple)

    swapped = True
    while swapped:
        swapped = False
        for i in range(len(lst) - 1):
            if lst[i] > lst[i + 1]:
                lst[i], lst[i + 1] = lst[i + 1], lst[i]
                swapped = True

    return lst

Я не знаю, как я мог бы реализовать реверсфункция reverse = False. Кто-нибудь знает, как реализовать эту функцию?

Заранее спасибо за помощь.

1 Ответ

0 голосов
/ 06 октября 2019

Проблема в этой строке:

if lst[i] > lst[i + 1]:

независимо от значения reverse , оператор всегда будет больше (> ), в то время как в некоторых случаях (в зависимости от реверс ) вам нужно ниже ( <</em>)один.
Самым простым способом достижения этого является замена оператора функцией, которая выполняет сравнение, и эта функция также учитывает реверс . Вот пример, который использует лямбда .

code00.py :

#!/usr/bin/env python3

import sys
#import operator


def bubble_sort(unsorted, reverse=False):
    compare_func = (lambda x, y: x < y) if reverse else (lambda x, y: x > y)  # Create a separate function depending the value of reverse, so it's not checked every time the function is called
    #compare_func = operator.lt if reverse else operator.gt  # Use operator instead of lambdas
    lst = unsorted[:]  # Create a copy of the list
    swapped = True
    while swapped:
        swapped = False
        for i in range(len(lst) - 1):
            if compare_func(lst[i], lst[i + 1]):
                lst[i], lst[i + 1] = lst[i + 1], lst[i]
                swapped = True
    return lst


def main():
    l = [2, 6, 9, 1, 4, 7]
    reverse = False
    print("Reverse: {0:}\n  List: {1:}".format(reverse, bubble_sort(l, reverse=reverse)))
    reverse = True
    print("Reverse: {0:}\n  List: {1:}".format(reverse, bubble_sort(l, reverse=reverse)))


if __name__ == "__main__":
    print("Python {0:s} {1:d}bit on {2:s}\n".format(" ".join(item.strip() for item in sys.version.split("\n")), 64 if sys.maxsize > 0x100000000 else 32, sys.platform))
    main()
    print("\nDone.")

Примечания :

Вывод :

[cfati@CFATI-5510-0:e:\Work\Dev\StackOverflow\q058256197]> "e:\Work\Dev\VEnvs\py_064_03.07.03_test0\Scripts\python.exe" code00.py
Python 3.7.3 (v3.7.3:ef4ec6ed12, Mar 25 2019, 22:22:05) [MSC v.1916 64 bit (AMD64)] 64bit on win32

Reverse: False
  List: [1, 2, 4, 6, 7, 9]
Reverse: True
  List: [9, 7, 6, 4, 2, 1]

Done.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...