Сортировка пузырьком. Язык Python

Сортировка пузырьком — это метод сортировки массивов и списков путем последовательного сравнения и обмена соседних элементов, если предшествующий оказывается больше последующего.

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

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

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

Пусть имеется список [6, 12, 4, 3, 8].

За первую итерацию внешнего цикла число 12 переместится в конец.

Для этого потребуется 4 сравнения во внутреннем цикле:

  • 6 > 12? Нет
  • 12 > 4? Да. Меняем местами
  • 12 > 3? Да. Меняем местами
  • 12 > 8? Да. Меняем местами

Результат: [6, 4, 3, 8, 12]

За вторую итерацию внешнего цикла число 8 переместиться на предпоследнее место. Для этого потребуется 3 сравнения:

  • 6 > 4? Да. Меняем местами
  • 6 > 3? Да. Меняем местами
  • 6 > 8? Нет

Результат: [4, 3, 6, 8, 12]

На третьей итерации внешнего цикла исключаются два последних элемента. Количество итераций внутреннего цикла равно двум:

  • 4 > 3? Да. Меняем местами
  • 4 > 6? Нет

Результат: [3, 4, 6, 8, 12]

На четвертой итерации внешнего цикла осталось сравнить только первые два элемента, поэтому количество итераций внутреннего равно единице:

  • 3 > 4? Нет

Результат: [3, 4, 6, 8, 12]

Реализация сортировки пузырьком с помощью циклов for

from random import randint
 
N = 10
a = []
for i in range(N):
    a. append(randint(1, 99))
print(a)
 
 
for i in range(N-1):
    for j in range(N-i-1):
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]
 
print(a)

Пример выполнения кода:

[63, 80, 62, 69, 71, 37, 12, 90, 19, 67]
[12, 19, 37, 62, 63, 67, 69, 71, 80, 90]

С помощью циклов while

from random import randint
 
N = 10
a = []
for i in range(N):
    a.append(randint(1, 99))
print(a)
 
i = 0
while i < N - 1:
    j = 0
    while j < N - 1 - i:
        if a[j] > a[j+1]:
            a[j], a[j+1] = a[j+1], a[j]
        j += 1
    i += 1
 
print(a)

Функция сортировки пузырьком на Python

from random import randint
 
def bubble(array):
    for i in range(N-1):
        for j in range(N-i-1):
            if array[j] > array[j+1]:
                buff = array[j]
                array[j] = array[j+1]
                array[j+1] = buff
 
N = 10
a = []
for i in range(N):
    a.append(randint(1, 99))
 
print(a)
bubble(a)
print(a)

Больше задач в PDF


Пузырьковая сортировка на Python и С# OTUS

В этом материале мы поговорим про алгоритм сортировки пузырьком (Bubble sort). Для примера попробуем отсортировать массив вручную, после чего напишем код для сортировки пузырьком на языке программирования Python и Си шарп.

Описание алгоритма

В процессе сортировки пузырьком происходит попарное сравнение соседних элементов массива, начиная с нулевого. После первой итерации самое большое число окажется на месте последнего, причем в дальнейших итерациях это значение уже задействоваться не будет (по сути, мы получим n-1 сравнений). Далее алгоритм находит второй по величине элемент, который ставится на предпоследнее место, потом третий и пр. В результате на месте нулевого элемента (не забываем, что нумерация в массиве начинается с нуля) окажется наименьшее число, а на месте последнего элемента – наибольшее. То есть мы можем сказать, что элементы от большего к меньшему «всплывают» по аналогии с пузырьками.

Проговорим алгоритм еще раз:

  1. Текущий элемент сравнивается с последующим.
  2. Если последующий меньше или больше, они меняются местами.
  3. Когда сортировка заканчивается, алгоритм прекращает работу, иначе снова происходит переход на шаг № 1.

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

Рассмотрим пример

Представьте, что у нас есть следующий массив: 

7 2 9 4 1 0

В процессе первой итерации мы возьмем нулевой элемент (это 7) и сравним его с соседним. Так как семь больше двух, числа меняются своими местами. То есть массив меняется:

7 9 4 1 0

Потом происходит сравнение второго и третьего числа. Так как изначально 9 больше семи, то семь остается на месте. Далее 9 последовательно сравнивается с остальными значениями и таким образом постепенно перемещается в самый конец массива (так как числа, большего, чем 9, в массиве нет, девятка занимает заслуженное последнее место).

2 7 4 1 0 9

Первая итерация закончена, количество шагов уменьшилось на 1 (n-1), то есть 9 находится там, где надо. Больше это число не затрагивается.

Во второй итерации все опять начинается с нулевого элемента массива (в нашем случае это двойка) с последующими сравнениями и перемещениями. В результате массив будет выглядеть следующим образом:

2 4 1 0 7 9

И так далее. Итоговый вид массива после сортировки по методу пузырьком вы можете видеть ниже:

0 1 2 4 7 9

Как видите, ничего сложного в этом нет.

Реализация на Си шарп

Чтобы реализовать сортировку пузырьком, сначала над создать саму функцию сортировки, которая будет располагаться в итоге перед функцией main:

 static int[] BubbleSort(int[] mas)

        {

            int temp;

            for (int i = 0; i < mas.Length; i++)

            {

                for (int j = i + 1; j < mas. Length; j++)

                {

                    if (mas[i] > mas[j])

                    {

                        temp = mas[i];

                        mas[i] = mas[j];

                        mas[j] = temp;

                    }                  

                }           

            }

            return mas;

        }

Итоговый код будет выглядеть следующим образом:

Реализация на Python

Теперь давайте попробуем выполнить сортировку пузырьком c «Пайтон»:

По материалам:

  • https://all-python.ru/primery/puzyryok.html;
  • https://csharp.webdelphi.ru/sortirovka-massiva-c-algoritm-sortirovka-puzyrkom/;
  • https://vscode.ru/prog-lessons/sortirovka-metodom-puzyirka-c-sharp.html.

Программа Python для пузырьковой сортировки

Улучшить статью

Сохранить статью

  • Уровень сложности: Easy
  • Последнее обновление: 13 июн, 2022

  • Читать
  • Обсудить
  • Улучшить статью

    Сохранить статью

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

    Python3

     

    def bubbleSort(arr):

         n = len (arr)

        

        

         swapped = False

    для I В Диапазон (N - 1 333333): - 1 333333333 годы: - 1 33333333 гг.0034

            

            

            

             for j in range ( 0 , n - i - 1

    ):

    if arr[j] > arr[j + 1 ]:

                     swapped = True

                     arr[j], arr[j + 1 ] = arr[j +

    1 ], arr[j]

              

             if not swapped:

                

                

                 return

     

     

    arr = [ 64 , 34 , 25

    , 12 , 22 , 11 , 90 ]

    90
    ]

    9033. 0032 bubbleSort(arr)

     

    print ( "Sorted array is:" )

    for i in range ( len ( ARR):

    Печать ( " % D" % ARR [I], END = " ) " ) "" )
    " ) " ) " ) " "

     Отсортированный массив:
     11 12 22 25 34 64 90 

    Временная сложность : O(n 2 ).

    Вспомогательное помещение : O(1).

    Подробную информацию см. в полной статье о сортировке пузырьком!

    Python3

    def bubblesort(elements):

         swapped = False

        

         for n in range ( len (elements)

    - 1 , 0 , - 1 ):

    для I В Диапазон (n):

    , если Elements [I] elements elements + . 0033 1 ]:

                    

    swapped = True

                    

                     elements[i], elements[i + 1 ] = Элементы [I + 1 ], Элементы [I]

    Если Не .0032             

                

                 return

     

    elements = [ 39 , 12 , 18 , 85 , 72 , 10 , 2 , 18 ]

    . 0034 ( "Unsorted list is," )

    print (elements)

    bubblesort(elements)

    print ( "Sorted Array is, " )

    печать (элементы)

    Вывод

     Несортированный список,
    [39, 12, 18, 85, 72, 10, 2, 18]
    Сортированный массив,
    [2, 10, 12, 18, 18, 39, 72, 85] 

    Временная сложность : O(n 2 ). Однако на практике эта оптимизированная версия может занять меньше времени, так как при сортировке массива функция вернется.

    Вспомогательное помещение : O(1).


    Алгоритм пузырьковой сортировки в Python с использованием списка Пример

    Что такое пузырьковая сортировка?

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

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

    Из этого руководства по пузырьковой сортировке в Python вы узнаете:

    • Что такое пузырьковая сортировка?
    • Реализация алгоритма пузырьковой сортировки
    • Оптимизированный алгоритм пузырьковой сортировки
    • Визуальное представление
    • Примеры Python
    • Код Пояснение
    • Преимущества пузырьковой сортировки
    • Пузырьковая сортировка Недостатки
    • Анализ сложности пузырьковой сортировки

    Реализация алгоритма пузырьковой сортировки

    Мы разобьем реализацию на три (3) этапа, а именно: проблема, решение и алгоритм, который мы можем использовать для написания кода для любого языка.

    Проблема

    Список предметов дан в случайном порядке, и мы хотели бы расположить элементы в упорядоченном порядке

    Рассмотрим следующий список:

     [21,6,9,33,3] 

    Решение

    Перебрать список, сравнивая два соседних элемента и меняя их местами, если первое значение больше второго.

    Результат должен быть следующим:

     [3,6,9,21,33] 

    Алгоритм

    Алгоритм пузырьковой сортировки работает следующим образом

    Шаг 1) Получить общее количество элементов. Получить общее количество элементов в заданном списке

    Шаг 2) Определите количество внешних проходов (n – 1), которые необходимо выполнить. Его длина равна списку минус один

    Шаг 3) Выполнить внутренние проходы (n – 1) раз для внешнего прохода 1. Получить значение первого элемента и сравнить его со вторым значением. Если второе значение меньше первого, то поменяйте местами

    Шаг 4) Повторите шаги шага 3, пока не дойдете до внешнего прохода (n – 1). Получите следующий элемент в списке, затем повторите процесс, выполненный на шаге 3, пока все значения не будут размещены в правильном порядке возрастания.

    Шаг 5) Вернуть результат после выполнения всех проходов. Возврат результатов отсортированного списка

    Шаг 6) Алгоритм оптимизации

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

    Оптимизированный алгоритм пузырьковой сортировки

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

    Оптимизация пузырьковой сортировки помогает нам избежать ненужных итераций и сэкономить время и ресурсы.

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

    Оптимизация выполняется с помощью следующих шагов

    Шаг 1) Создайте флаговую переменную, которая отслеживает, происходил ли какой-либо обмен во внутреннем цикле

    Шаг 2) Если значения поменялись местами, перейти к следующей итерации

    Шаг 3) Если преимущества не поменялись местами, завершить внутренний цикл и продолжить внешний цикл.

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

    Визуальное представление

    Учитывая список из пяти элементов, следующие изображения иллюстрируют, как пузырьковая сортировка перебирает значения при их сортировке

    На следующем рисунке показан несортированный список

    Первая итерация

    Шаг 1)

    92012

    21 больше 6, поэтому 21 занимает позицию, занятую 6, а 6 занимает позицию, которую занимал 21

    Наш измененный список теперь выглядит так, как показано выше.

    Шаг 2)

    Сравниваются значения 21 и 9.

    21 больше 9, поэтому мы меняем местами 21 и 9

    Новый список выглядит так, как указано выше больший.

    Значение 33 больше 21, поэтому обмен не происходит.

    Шаг 4)

    Значения 33 и 3 сравниваются для нахождения большего.

    Значение 33 больше 3, поэтому мы меняем их местами.

    Отсортированный список в конце первой итерации аналогичен приведенному выше

    Вторая итерация

    Новый список после второй итерации выглядит следующим образом после третьей итерации выглядит следующим образом

    Четвертая итерация

    Новый список после четвертой итерации выглядит следующим образом

    Примеры Python

    В следующем коде показано, как реализовать алгоритм пузырьковой сортировки в Python.

     def пузырьковая сортировка (theSeq):
        n = len( theSeq )
        для я в диапазоне (n - 1):
            флаг = 0
            для j в диапазоне (n - 1):
                
                если theSeq[j] > theSeq[j + 1] :
                    tmp = theSeq[j]
                    theSeq[j] = theSeq[j + 1]
                    theSeq[j + 1] = tmp
                    флаг = 1
            если флаг == 0:
                перерыв
        вернутьПоследовательность
    эл = [21,6,9,33,3]
    результат = пузырьковая сортировка (эль)
    печать (результат)
     

    Выполнение вышеуказанной программы пузырьковой сортировки в Python приводит к следующим результатам:

     [6, 9, 21, 3, 33]
     

    Объяснение кода

    Объяснение кода программы Python Bubble Sort выглядит следующим образом:

    ЗДЕСЬ,

    1. Определяет функцию bubbleSort, которая принимает параметр theSeq. Код ничего не выводит.
    2. Получает длину массива и присваивает значение переменной n. Код ничего не выводит
    3. Запускает цикл for, запускающий алгоритм пузырьковой сортировки (n – 1) раз. Это внешний цикл. Код ничего не выводит
    4. Определяет переменную флага, которая будет использоваться для определения того, произошла ли замена. Это в целях оптимизации. Код ничего не выводит
    5. Запускает внутренний цикл, сравнивающий все значения в списке от первого до последнего. Код ничего не выводит.
    6. Использует оператор if, чтобы проверить, больше ли значение в левой части, чем значение в непосредственной правой части. Код ничего не выводит.
    7. Присваивает значение theSeq[j] временной переменной tmp, если условие оценивается как истинное. Код ничего не выводит
    8. Значение Seq[j + 1] назначается позиции Seq[j]. Код ничего не выводит
    9. Значение переменной tmp присвоено позиции theSeq[j + 1]. Код ничего не выводит
    10. Переменной флага присваивается значение 1, чтобы указать, что обмен произошел. Код ничего не выводит
    11. Использует оператор if, чтобы проверить, равно ли значение флага переменной 0. Код ничего не выводит
    12. Если значение равно 0, то мы вызываем оператор break, который выходит из внутреннего цикла.
    13. Возвращает значение theSeq после его сортировки. Код выводит отсортированный список.
    14. Определяет переменную el, содержащую список случайных чисел. Код ничего не выводит.
    15. Присваивает значение функции bubbleSort переменной result.
    16. Выводит значение переменной result.

    Преимущества пузырьковой сортировки

    Ниже приведены некоторые преимущества алгоритма пузырьковой сортировки

    • Легко понять
    • Очень хорошо работает, когда список уже или почти отсортирован
    • Не требует большой памяти.
    • Легко написать код для алгоритма
    • Минимальные требования к месту по сравнению с другими алгоритмами сортировки.

    Пузырьковая сортировка Недостатки

    Ниже перечислены некоторые недостатки алгоритма пузырьковой сортировки.

    • Он плохо работает при сортировке больших списков. Это требует слишком много времени и ресурсов.
    • В основном используется в академических целях, а не в реальном мире.
    • Количество шагов, необходимых для сортировки списка, имеет порядок n 2

    Анализ сложности пузырьковой сортировки

    Существует три типа сложности:

    1) Сложность сортировки

    Сложность сортировки используется для выражения количества времени выполнения и пространства, необходимого для сортировки списка. Пузырьковая сортировка выполняет (n — 1) итераций для сортировки списка, где n — общее количество элементов в списке.

    2) Временная сложность

    Временная сложность пузырьковой сортировки O(n 2 )

    Временные сложности можно разделить на следующие категории: заказ. Алгоритм выполняет максимальное количество выполнений, которое выражается как [Big-O] O(n 2 )

  • В лучшем случае — это происходит, когда предоставленный список уже отсортирован. Алгоритм выполняет минимальное количество выполнений, которое выражается как [Big-Omega] Ω(n)
  • .
  • Средний случай — это происходит, когда список находится в случайном порядке. Средняя сложность представлена ​​как [Big-theta] ⊝(n 2 )
  • 3) Сложность пространства

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

    Сводка