3. Обменная поразрядная сортировка
Данный метод использует двоичное представление ключей. Файл сортируется последовательно по битам двоичного представления ключей, начиная со старшего. Ключи, имеющие значение данного бита, равное нулю, ставятся в левую половину файла, а ключи со значением бита 1 - в правую. Ниже приведена схема алгоритма поразрядной сортировки.
Функция b(ключ) возвращает значение бита с номером b аргумента, m - максимальное количество значащих битов в ключах.
l=1; r=N; b=1;
║
╔══>═╬══<══════════════════════════════════════════════╗
║ ║ ╔═══════════<═══════════════════════════╬═══════════════╗
║ ║ ┌──╫─────────────────────────────────────┐ ║ ║
║ ║ │ if(стек пуст) Конец; │ ║ ║
║ if(l=r) │ ┌──────────────────────────────┐ │ ║ ║
║ │ else │l=r+1; │ │ ║ ║
║ │ │Взять из стека элемент (r',b')╞>═╪═╝ ║
║ │ │r=r'; b=b'; │ │ ║
║ │ └──────────────────────────────┘ │ ║
║ └────────────────────────────────────────┘ ║
║ i=l; j=r; ║
║ ┌────────────────────────────────────────┐ ║
║ ╔═if(b(K[i])=1)│j=j-1;══════════<═══════════╗ │ ║
║ ║ │ ┌──────────────────╫─────────┐ │ ║
║ ║ │if(i<=j) │ if(b(K[j+1])=1) ═╝ │ │ ║
║ ║ │ │ ┌───────────────┐ │ │ ║
║ ║ │ │ else │ K[i]<->K[j+1] ╞>═╗ │ │ ║
║ ║ │ │ └───────────────┘ ║ │ │ ║
║ ║ │else ═>╗ └─────────────────────────╫──┘ │ ║
║ ║ └───────╫───────────────────────────╫────┘ ║
║ ╚════<═════════════╗ ║ ║ ║
║ ┌──────────╫───╫───────────────────────────╨────────────┐ ║
║ else │ i=i+1; ║ ║ │ ║
║ │ if(i<=j)═╝ ║ │ ║
║ │ ┌───────╨─────────────────────────────────────┐ │ ║
║ │ │ b=b+1; │ │ ║
║ │ else │ if(b>m) ═>══════════════════════════════════╪══╪════╝
╚════<════╪══════╪══════════════════╦═<═╦══════════════<═╗ │ │
│ │ if(j<l или j=r)═>╝ ║ ║ │ │
│ │ ┌────────────── ╫────────────────╫───┐ │ │
│ │ else │if(j=l) l=l+1═>╝ ║ │ │ │
│ │ │ ┌────────────────────────┐ ║ │ │ │
│ │ │else │ Поместить в стек (r,b);╞>╝ │ │ │
│ │ │ │ r=j; │ │ │ │
│ │ │ └────────────────────────┘ │ │ │
│ │ └────────────────────────────────────┘ │ │
│ └─────────────────────────────────────────────┘ │
└───────────────────────────────────────────────────────┘
Пример использования этого алгоритма приведен ниже. Значения элементов файла даны в 16-ричной системе счисления. Квадратные скобки [] использованы для обозначения подфайлов с одинаковым значением бита b (b=1 соответствует старшему биту ).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 │l r b
───────────────────────────────────────────────────────────────┼───────
┌─ ─┐│
│1F7 57 200 3D 38C AA 381 113 28D 1AA 9A 1FD 264 2A5 2FD 2BF││ 1 16 1
│ ─┐┌─ ││
│1F7 57 1FD 3D 9A AA 1AA 113││28D 381 38C 200 264 2A5 2FD 2BF││ 1 8 2
│ ─┐┌─ ││ ││
│AA 57 9A 3D││1FD 1F7 1AA 113││28D 381 38C 200 264 2A5 2FD 2BF││ 1 4 3
│ ─┐┌─ ││ ││ ││
│3D 57││9A AA││1FD 1F7 1AA 113││28D 381 38C 200 264 2A5 2FD 2BF││ 1 2 4
└─ ─┘│ ││ ││ ││
│ ││ ││ ││
3D 57 │9A AA││1FD 1F7 1AA 113││28D 381 38C 200 264 2A5 2FD 2BF││ 3 4 4
│ ││ ││ ││
3D 57 │9A AA││1FD 1F7 1AA 113││28D 381 38C 200 264 2A5 2FD 2BF││ 3 4 5
└─ ─┘│ ││ ││
│ ││ ││
3D 57 9A AA│1FD 1F7 1AA 113││28D 381 38C 200 264 2A5 2FD 2BF││ 5 8 3
└─ ┌─ ││ ││
3D 57 9A AA 113│1F7 1AA 1FD││28D 381 38C 200 264 2A5 2FD 2BF││ 6 8 4
└─ ┌─ ││ ││
3D 57 9A AA 113 1AA│1F7 1FD││28D 381 38C 200 264 2A5 2FD 2BF││ 7 8 5
│ ││ ││
3D 57 9A AA 113 1AA│1F7 1FD││28D 381 38C 200 264 2A5 2FD 2BF││ 7 8 6
│ ││ ││
3D 57 9A AA 113 1AA│1F7 1FD││28D 381 38C 200 264 2A5 2FD 2BF││ 7 8 7
└─ ─┘└─ ││
┌─ ││
3D 57 9A AA 113 1AA 1F7 1FD │28D 381 38C 200 264 2A5 2FD 2BF││ 9 16 2
│ ─┐┌─ ││
3D 57 9A AA 113 1AA 1F7 1FD │28D 2BF 2FD 200 264 2A5 ││2FD 381││ 9 14 3
│ ─┐┌─ ││ ││
3D 57 9A AA 113 1AA 1F7 1FD │264 200││2FD 2BF 28D 2A5││2FD 381││ 9 10 4
└─ ─┘└─ ──┘└─ ─┘│
┌─ ─┐┌─ ─┐│
3D 57 9A AA 113 1AA 1F7 1FD 200 264│2A5 2BF 28D 2A5││38C 381││11 14 4
│ ││ ││
│ ─┐┌─ ││ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264│28D 2BF 28D││2FD││38C 381││11 13 5
└─ ││ ││ ││
┌─ ││ ││ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D│2BF 2A5││2FD││38C 381││12 13 6
└─ ─┘└─ ─┘└─ ││
┌─ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D 2A5 2BF 2FD │38C 381││15 16 3
│ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D 2A5 2BF 2FD │38C 381││15 16 4
│ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D 2A5 2BF 2FD │38C 381││15 16 5
│ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D 2A5 2BF 2FD │38C 381││15 16 6
│ ││
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D 2A5 2BF 2FD │38C 381││15 16 7
└─ ─┘│
3D 57 9A AA 113 1AA 1F7 1FD 200 264 28D 2A5 2BF 2FD 38C 381 │17 - -
