// Возвращает ссылку на отсортированный односвязный список
// Передается: та же ссылка list, но на неотсортированный список и width
function radixList(list, width, range)
// Дополнительные переменные типа списка(listtype)
// out - результирующий список, который пока идиентичен
// исходному
out = list;
// Массивы ссылок на головы и хвосты списков карманов
head = newArrayOfList[range]
tail = newArrayOfList[range]
// Вспомогательная переменная
rangepow = 1;
for step = 0 to (width - 1)
// Обнуляем все карманы
for i = 0 to range - 1
head[i] = NULL
tail[i] = NULL
// РАСПРЕДЕЛЕНИЕ >>
// Проходимся по всему исходному списку
// пока не будет достигнут конец
//(ссылка на текущий элемент - в никуда)
while list != NULL
// Получаем значение step-го разряда текущего элемента(ключа)
// ("/" - целочисленное деление)
currDigit = (list->val / rangepow) % range;
// получаем ссылку на хвост текущего кармана
temp = tail[currDigit];
// Если карман пуст, то текущий элемент
// будет его головой, иначе добавляем текущий элемент
// в конец кармана
if head[currDigit]=NULL head[currDigit] = list;
else temp->next = list;
// Обновляем хвост текущего кармана
// чтобы теперь он указывал на новый добавленный
// элемент
temp = tail[currDigit] = list;
temp->next = NULL;
// Переходим к следующему элементу списка
list = list->next;
end while
// Находим в переменную i первый непустой карман,
// чтобы с него начать сборку.
for i = 0 to (range - 1)
if ( head[i] != NULL ) break;
// СБОРКА >>
list = head[i];
temp = tail[i];
for currDigit = i+1 to range
if head[currDigit] != NULL
temp->next = head[currDigit];
temp = tail[currDigit];
// !!! важный момент: чтобы на след. итерации в currDigit
// при "распределении" получить следующий разряд - возводим
// в степерь вспомогательную переменную:
rangepow *= range;
end for
// Возвращаем ссылку на первый элемент отсортированного списка
return out;