Проблема в этой строке:
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.