shearsort(field A, int l, int r) {
rows:= Round(Down, Math.sqrt(r-l+1));
while (rows > 1) and (((r-l+1) mod rows) <> 0) do {
rows--;
}
cols:= (r-l+1)/rows;
for k:= Round(Up, log(rows)) downto 1 do {
for j:= 1 to cols do {
for i:= l to r step cols do parallel {
oet(A, i+(j mod 2), i+cols-1, 1, ((((i-l)/cols) mod 2) = 0));
}
}
for j:= 1 to rows do {
for i:= l to l+cols-1 do parallel {
oet(A, i+(j mod 2)*cols, r-l-cols+i+1, cols, true);
}
}
}
for j:= 1 to cols do {
for i:= l to r step cols do parallel {
oet(A, i+(j mod 2), i+cols-1, 1, true);
}
}
}
oet(ifield A, int l, int r, int gap, boolean asc) {
for i:= l to r-gap step 2*gap do parallel {
if ((A[i] > A[i+gap]) == asc) {
exchange(A[i], A[i+gap]);
}
}
}
|