Это сортировка вставки https://en.wikipedia.org/wiki/Insertion_sort
Вы можете представить себе, как будто сортируете потоковый список элементов:
for i in range(30): # for each item streamed here
mn = data[i] # take the new item (if exists new item)
for j in data: # find its place in the sorted data, and insert it there:
if j < mn: # if found its place, insert it here
mn = j
data[i], data[data.index(mn)] = data[data.index(mn)], data[i]
ОБНОВЛЕНИЕ
Интуиция, стоящая за сортировкой вставок, заключается в том, что вы обновляете ранее отсортированный список каждый раз, когда получаете новый элемент. Таким образом, вам не нужно беспокоиться о позиции сортировки будущих предметов.
Так как данные до времени i
отсортированы, то после нахождения первого обмена все элементы будут поменяться местами, пока не наступит время i
.
Теперь проблема скоманда подкачки:
data[i], data[data.index(mn)] = data[data.index(mn)], data[i]
Эта команда подкачки фактически игнорирует будущие перестановки (когда data.index(mn)
больше текущего времени i
). Однако, поскольку он работает, когда время i
больше, чем data.index(mn)
, этого достаточно для сортировки при вставке. Это пример:
# two attempts to swapping x and y:
data = ['x', 'y']
# ignored (target of swap is at time i, found position in future!):
i = 0; mn = 'y' # data.index(mn) == 1
data[i], data[data.index(mn)] = data[data.index(mn)], data[i]
print('ignored swap', data)
# success (target of swap is at time i, found position in past (before i)):
i = 1; mn = 'x' # data.index(mn) == 0
data[i], data[data.index(mn)] = data[data.index(mn)], data[i]
print('success swap', data)