Описание алгоритма
Исходный код на PythonКак найти наименьшее значение в списке?
s = [2,4,1,3] #подопытный список m = 0 #индекс первого элемента i = 1 #индекс второго элемента while i < len(s): #пока индекс меньше длины строки if s[i] < s[m]: # если значение под индексом i меньше, чем под m, m = i # то присвоить m индекс i i += 1 # увеличить i на единицу print (s[m]) # вывести значение элемента под индексом m Обратите внимание на строку while i < len(s):. Не нужно писать <=, т.к. индексация начинается с нуля. Это значит, что когда i равен 3, то мы обращаемся к 4-му элементу списка (в примере, это как раз конец строки).
s = [2,4,9,1,3,7,5] #подопытный список # требуется поменять местами первый и четвертый элементы m = 0 #индекс первого элемента i = 3 #индекс четвертого элемента t = s[m] # сохраняется значение под индексом m s[m] = s[i] # на его место записывается значение под индексом i s[i] = t # на место значения под индексом i записывается ранее сохраненное значение под индексом m Полный алгоритм сортировки выбором
s = [2,4,8,1,0,3,9,5,7,6] print (s) #в переменной k хранится индекс элемента, подлежащего обмену (двигаемся слева на право) k = 0 while k < len(s) - 1: #-1, т.к. последний элемент обменивать уже не надо m = k #в m хранится минимальное значение i = k + 1 #откуда начинать поиск минимума (элемент следующий за k) while i < len(s): if s[i] < s[m]: m = i i += 1 t = s[k] s[k] = s[m] s[m] = t k += 1 #переходим к следующему значению для обмена print(s) Оформление алгоритма в виде функции и пример использования цикла for
def mymin(mylist): for k in range(len(mylist) - 1): m = k i = k + 1 while i < len(mylist): if mylist[i] < mylist[m]: m = i i += 1 t = mylist[k] mylist[k] = mylist[m] mylist[m] = t |
|||


уходим от while
Производительность
Извиняюсь, я вот все никак не пойму, а почему сортировка выбором работает медленнее пузырька?
Примеры брал ваши.
Во всех источниках говорится, что в среднем быстрее должна быть выбором, а не пузырек.
Это какая то особенность работы Python с list или что?
А как вы определили, что
А как вы определили, что сортировка выбором работает медленнее?
По-идее, в обоих случаях изменяется исходный список. Так что, "тормознутость" бы проявилась в обоих случаях.
# -*- coding: utf-8
Вот таким методом.
Действительно, загадка
Могу только предположить, что это связано с тем, что в Питоне переменные по сути являются лишь ссылками.
При сортировке списка данные в памяти могут не переставляться, меняются лишь значение указателей на них (ссылок на память, их роль играют индексы). Т.е. если mylist[10] указывает на число 325, то после сортировки на это число может указывать mylist[89], однако само число остается на месте.
По идее, в методе пузырька память данных остается не тронутой. А вот в сортировке выборкой как минимум из-за переменной t происходит копирование значения в другую область памяти.
Проблема решена!
Не стоит ночью править код, не видишь того, что написано черным по белому!
Профайлер писал что вычисление длины списка происхожило 500500, отсюда и проблема!
Ну жно всего лишь заменить
и использовать везде её, а не вычислять длину заново.
К сожалению даже с этим исправлением этот вариант сортировки не обходит пузырек(((
Код на вики работает быстрее(обоих), поэтому предлогаю использовать его, только там ищут макс и соответственно добавляют вверх.
И все же...почему ваш код медленнее???
Если заменить эти строчки t =
Если заменить эти строчки
вот так:
, то сортировка выбором будет быстрее.
Действительно, с точки зрения Python код выше для сортировки выбором написан не корректно.
Спасибо
Спасибо! Видимо как вы говорили так и происходит, меняются лишь указатели.