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 i:= l to r step cols do parallel {
oetsort(A, i, i+cols-1, cols, 1, ((((i-l)/cols) mod 2) = 0));
}
for i:= l to l+cols-1 do parallel {
oetsort(A, l+i, r-l-cols+i+1, rows, cols, true);
}
}
for i:= l to r step cols do parallel {
oetsort(A, i, i+cols-1, cols, 1, true);
}
}
oetsort(ifield A, int l, int r, int n, int gap, boolean asc) {
for i:= 1 to n do {
oet(A, l+(i mod 2)*gap, r, gap, asc);
}
}
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]);
}
}
}
|