Сортировка пузырьком проблемы с выводом

Рейтинг: 0Ответов: 2Опубликовано: 10.07.2023

Сам алгоритм работает, но нужно, чтобы при каждой перестановке выводился результат сортировки. То если была одна перестановка, то массив выводился в консоль один раз, если перестановка не требуется (все числа в массиве равны) тоже выводится один раз

def bubble_sort(array):
    for i in range(len(array)-1):
        counter = 0
        for j in range(len(array)-1-i):
            if array[j] > array[j+1]:
                array[j], array[j+1] = array[j+1], array[j]
                counter += 1
        if counter > 0:
            print(' '.join(map(str, array)))
        else:
            print(' '.join(map(str, array)))
            break


n = int(input())                                   # вводим 5
array = [int(x) for x in input().strip().split()]  # вводим 12 8 9 10 11

bubble_sort(array)  # ожидаем вывод вида 8 9 10 11 12 (то есть только одна строка)
                    # а получаем 8 9 10 11 12
                    #            8 9 10 11 12

Update Решение, которое предложили, работает как задумано

def bubble_sort(array):
    nosorting = True
    for i in range(len(array)-1):
        counter = 0        
        for j in range(len(array)-1-i):
            if array[j] > array[j+1]:
                array[j], array[j+1] = array[j+1], array[j]
                counter += 1                
        if counter > 0:
            nosorting = False
            print(' '.join(map(str, array)))
        else:            
            break
    if nosorting == True:
        print(' '.join(map(str, array)))
        

n = int(input())
array = [int(x) for x in input().strip().split()]

bubble_sort(array) 

Ответы

▲ 1Принят

Если исходный массив выводить нужно всегда, то переставьте вывод в начало цикла, делайте print независимо от counter. Тогда выведется исходный массив и все изменения.

Если выводить его только в случае, когда сортировка не понадобилась, то при увеличении counter сбросьте флаг nosorting = false (с начальным значением true), а в самом конце вне циклов проверяйте его и тогда уже выводите массив

▲ 0

Чтобы список печатался только один раз достаточно сдвинуть break на один отступ влево, вот так:

def bubble_sort(array):
    for i in range(len(array)-1):
        ...
        if counter > 0:
            print(' '.join(map(str, array)))
        else:
            print(' '.join(map(str, array)))
            break  # ---
        break      # +++

PS: тремя минусами (---) отмечена удаленная строка, а тремя плюсами (+++) - добавленная.