combsort(field A, int l, int r) {
gap:= r-l;
do {
if (gap > 1) then {
gap:= Round(Down, gap/1.3);
if ((gap = 9) or (gap = 10)) then {
gap:= 11;
}
}
} while ((comb(A, l, r, gap)) or (gap > 1));
}
boolean comb(field A, int l, int r, int gap) {
oet(A, l, r, gap);
return oet(A, l+gap, r, gap);
}
boolean oet(field A, int l, int r, int gap) {
flipped:= false;
for i:= l to r-gap step 2*gap do parallel {
for j:= i to ((i+gap-1) or (r-gap)) do parallel {
if (A[j] > A[j+gap]) then {
exchange(A[j], A[j+gap]);
flipped = true;
}
}
}
return flipped;
}
|