Jest to poprawione sortowanie przez wstawianie, sortowanie za pomocą malejących przyrostów. Na szybkość algorytmu wpływa wybór sekwencji przyrostów. Przykładowe sekwencje, które dają dobrą wydajność:
# Wersja wg Kernighana i Ritchiego.
# Oryginalna sekwencja przyrostów Shella: 1, 2, 4, 8, 16, 32, ...
# Metoda degeneruje się do czasu kwadratowego dla złośliwych danych.
def shellsort(L, left, right):
h = (right - left) // 2
while h > 0:
for i in range(left + h, right + 1):
for j in range(i, left + h - 1, -h):
if L[j - h] > L[j]:
swap(L, j - h, j)
h = h // 2
# Wersja wg Sedgewicka.
def shellsort(L, left, right):
# Ustalenie największego kroku z sekwencji:
# 1, 4, 13, 40, 121, 364, 1093, 3280, 9841, ...
h = 1
while h <= (right-left) // 9:
h = 3*h+1
while h > 0:
for i in range(left+h, right+1):
j = i
# Zamiast swap() mamy przesuniecia.
item = L[i]
while j >= left+h and item < L[j-h]:
L[j] = L[j-h]
j = j-h
L[j] = item
h = h // 3