Przedstawiony algorytm sortowania jest oparty na standardowym algorytmie quicksort. Różnica polega na tym, że w pierwszym kroku procesor główny losuje spośród danych wejściowych N-1 wartości (gdzie N to liczba procesorów wirtualnych, są umieszczane w tablicy limits), a następnie uruchamia procesory wirtualne o indeksach o 0 do N-1. Procesor o numerze k przepisuje następnie do swojej pamięci podręcznej wszystkie elementy x spełniające zależność (przy czym =MIN_VALUE, a =MAX_VALUE), obliczając jednocześnie liczbę elementów mniejszych od . W kolejnym kroku każdy z procesorów za pomocą zwykłego algorytmu quicksort sortuje swój fragment pamięci. Na koniec posortowany blok jest przepisywany z powrotem do pamięci globalnej.
shared N; // liczba procesorów wirtualnych
shared data[0..4194303]; // dane do posortowania
shared limits[0..32]; // pomocnicza tablica
local proc; // indeks procesora
local buffer[0..4194303]; // bufor w pamięci podręcznej
local first; // zmienne pomocnicze
local last;
local min;
local max;
// poniższa funkcja służy do przepisania danych spełniających
// odpowiednie warunki z pamięci podręcznej do bufora
function copy_to_buffer(data_size)
local pom_buffer[0..data_size];
local i;
begin
blockread(data,pom_buffer,data_size);
for i:=0 to data_size-1 do
else if pom_buffer[i]<max then
buffer[last]:=pom_buffer[i];
// funkcja służąca do posortowania elementów tablicy buffer
// poczynając od komórki o numerze first, a kończąc na last
// jest ona wywoływana rekurencyjnie (zwykły algorytm quicksort)
function quicksort(first,last)
local begin1;
local end1;
local divider;
local pom;
begin
if last-first=1 then
if buffer[first]<=buffer[last] then return 0;
else
buffer[first]:=buffer[last];
buffer[last]:=pom;
divider:=buffer[random(last-first+1)+first];
begin1:=first;
end1:=last;
while end1>begin1 do
else if buffer[end1]>divider then end1:=end1-1;
else
buffer[begin1]:=buffer[end1];
buffer[end1]:=pom;
quicksort(end1,last);
// funkcja sprawdzająca czy podany jako parametr element występuje
// w tablicy limits
function limits_contain(element,max)
local i;
begin
// funkcja służąca do ustalania granic dla danych, którymi będą
// się zajmować procesory wirtualne
function set_limits(proc)
local i;
local j;
local l;
begin
while limits_contain(l,i-1)=1 do l:=data[random(data_size)];
limits[i]:=l;
for i:=1 to proc-2 do
limits[i]:=limits[j];
limits[j]:=l;
limits[0]:=MIN_VALUE;
limits[proc]:=MAX_VALUE;
// część główna programu
begin
quicksort(0,data_size-1);
blockwrite(buffer,data,data_size);
for proc:=0 to N-1 pardo
max:=limits[proc+1];
copy_to_buffer(data_size);
quicksort(0,last);
blockwrite(buffer,data[first],last+1);