Created
January 15, 2016 13:20
-
-
Save rkhapov/358718bb46c9cc0089b7 to your computer and use it in GitHub Desktop.
selection sort on python
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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