Sortowanie przez wstawianie polega na wstawianiu nowych elementów we właściwe miejsce już uporządkowanego zbioru. Algorytm jest stabilny. W czasie pracy algorytmu lewa strona tablicy zawiera rosnącą część posortowaną, a prawa strona tablicy zawiera malejącą część nieposortowaną, z której pobieramy kolejne elementy.
# Wersja nieadaptacyjna z dwiema pętlami for. def insertsort(L, left, right): for i in range(left+1, right+1): for j in range(i, left, -1): # od prawej do lewej (bez left) if L[j-1] > L[j]: swap(L, j-1, j) # zamiana sąsiadów
# Wersja nieadaptacyjna z pętlami for i while. def insertsort(L, left, right): for i in range(left+1, right+1): j = i while j > left: if L[j-1] > L[j]: swap(L, j-1, j) j = j-1
Porównania: 1 + 2 + ... + (n-1) = n*(n-1)/2.
Przestawienia: 1 + 2 + ... + (n-1) = n*(n-1)/2.
Można dokonać wielu ulepszeń:
# Wersja z wartownikiem wg Sedgewicka. # Ta wersja jest adaptacyjna. def insertsort(L, left, right): for i in range(right, left, -1): # ustawiam wartownika if L[i-1] > L[i]: swap(L, i-1, i) for i in range(left+2, right+1): j = i item = L[i] while item < L[j-1]: # robimy miejsce na item L[j] = L[j-1] j = j-1 L[j] = item
# https://pl.wikibooks.org/wiki/Kody_%C5%BAr%C3%B3d%C5%82owe/Sortowanie_przez_wstawianie # Poprawiony kod pythonowy. Nie ma swap() i wartownika. def insertsort(L, left, right): for i in range(left+1, right+1): # L[left] jest posortowany item = L[i] j = i while j > left and L[j-1] > item: L[j] = L[j-1] # robimy miejsce na item j = j-1 L[j] = item
Sortowanie przez wstawianie używa podejścia inkrementacyjnego: sortuj L w zakresie od left do j-1, potem wstaw L[j] we właściwe miejsce, aby otrzymać L posortowane w zakresie od left do j.
# Wersja rekurencyjna. def insertsort(L, left, right): if left < right: insertsort(L, left, right-1) item = L[right] j = right # Tu widać, że wartownik upraszcza warunek pętli. while j > left and item < L[j-1]: # robimy miejsce na item L[j] = L[j-1] j = j-1 L[j] = item