Skip to content

Instantly share code, notes, and snippets.

@rkhapov
Created January 15, 2016 13:20
Show Gist options
  • Save rkhapov/358718bb46c9cc0089b7 to your computer and use it in GitHub Desktop.
Save rkhapov/358718bb46c9cc0089b7 to your computer and use it in GitHub Desktop.
selection sort on python
#selection sort, 2 реализации
#Функция поиска индекса минимального/максимального элемента
#array - массив
#step - направление шага поиска
#beg - ничальная позиция
#size - сколько элементов пробежать
def find_compare(array, compare, step, beg, size):
#Пусть текущим минимальным элементом будет нулевой
find_index = beg
#Тогда поиск можно начинать с 1 элемента
curr_index = beg + step
_size = 1
while _size < size:
if compare(array[curr_index], array[find_index]):
find_index = curr_index
curr_index += step
_size += 1
return find_index
#Стандартная сортировка "снизу вверх"
#array - массив
#compare - компаратор. Можно использовать как для сортировки по-убыванию, так и по-возврастанию
def standart_selection_sort(array, compare):
#Принцип действия: на каждой итерации до индекса текущего
#элемента все числа отсортированы, поэтому текущий элемент следует
#заменить на максимальный\минимальный и перейти к следующей итерации
#p - индекс элемента, все элементы до которого отсортированы
#от последнего можно не сортировать
for p in range(len(array) - 1):
#Ищем следующий элемент, который можно обменять с текущим
#Неважно, максимальный это или минимальный, всё зависит от компаратора
#Ищем на оставшейся части массива
i = find_compare(array[p:], compare, 1, 0, len(array) - p)
#Добавляем p, так как find_compare возвращает индекс в переданном массиве,
#а не во всём array
i += p
#Обмениваем элементы: найденый и текущий
array[p], array[i] = array[i], array[p]
#массив отсортирован
#Сортировка "сверху вниз"
#Обратим внимание, что для это сортировки требуется "обратный компаратор", то есть
#min -> max, max -> min
def reverse_selection_sort(array, compare):
#Коментарии не требуются, тот же принцип действия, что и у standart_selection_sort
for p in range(len(array) - 1, 0, -1):
i = find_compare(array, compare, -1, p, len(array) - p)
array[p], array[i] = array[i], array[p]
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment