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

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

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

Исходный код на Python

li = [5,2,7,4,0,9,8,6] 
n = 1 
while n < len(li):
     for i in range(len(li)-n):
          if li[i] > li[i+1]:
               li[i],li[i+1] = li[i+1],li[i]
     n += 1

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

самое забавное то что я 1 в 1

самое забавное то что я 1 в 1 переписал код и сортирует криво! а как тупо скопировал, он работает!

здравствуйте! Кто-то может

здравствуйте!

Кто-то может пояснить предпоследнюю строчку? Почему записываем именно так?

li = [5,2,7,4,0,9,8,6] 
n = 1 
while n < len(li):
     for i in range(len(li)-n):
          if li[i] > li[i+1]:
               li[i],li[i+1] = li[i+1],li[i]
     n += 1

Здесь использовано

Здесь использовано параллельное присваивание оно применяется программистами. Так a, d = 1, 2 ,значит что a == 1 ,а d == 2.

Здесь было использовано

Здесь было использовано параллельное присваивание его часто применяют для краткости кода.

Строка li[i],li[i+1] =

Строка

li[i],li[i+1] = li[i+1],li[i]

равносильна коду
a = li[i]
li[i] = li[i+1]
li[i+1] = a

В обоих случаях происходит обмен значений переменных. В данном случае меняются элементы списка - текущий и следующий за ним.

Короткая запись li[i],li[i+1] = li[i+1],li[i] возможна только в Python, так как в нем есть такая структура данных как кортеж. Сначала извлекаются значения из li[i+1] и li[i] (т.е. выполняется код справа от знака равно), эти значения помещаются в кортеж. После этого значения кортежа присваиваются переменным, стоящим от знака равно слева. Первой переменной присваивается первый элемент, а второй - второй элемент кортежа. Другой пример:

a = 5
b = 6
a,b = b,a

После этого a станет равна 6, b 5.

очепятка ...

Ваш комментарий помещён в очередь на модерирование. Как только администрация одобрит его, комментарий будеь опубликован.
Уважаемый модератор, исправьте пожалуйста опечатку в слове будеТ :-)

с помощью двух циклов while

lst=[5,2,7,4,0,9,8,6,-100]
k=0
n=1
while n<(len(lst)):
    while k<(len(lst)-n):
        if lst[k]>lst[k+1]:
            lst[k],lst[k+1]=lst[k+1],lst[k]
            print lst # чтоб видеть "эволюцию" списка :-)
        k+=1
    k=0
    n+=1