blob: 93c1c19820c0c0a53eb183c65020653b654d3d79 [file] [log] [blame]
fn swap(xs, l, r) {
let temp = xs[l];
xs[l] = xs[r];
xs[r] = temp;
}
fn partition(xs, l, r, p) {
while l <= r {
while xs[l] < p {
l = l+1;
}
while xs[r] > p {
r = r -1;
}
if l <= r {
swap(xs, l, r);
l = l+1;
r = r -1;
}
}
return l;
}
fn qsort0(xs, l, r) {
if l >= r {
return;
}
let p = xs[(l+r)/2];
let i = partition(xs, l, r, p);
qsort0(xs, l, i-1);
qsort0(xs, i, r);
}
qsort = lambda(xs) ->
qsort0(xs, 0, count(xs)-1);
return xs;
end;
fn rand_list(n) {
let a = seq.list();
for i in range(0, n) {
seq.add(a, rand(n));
}
return a;
}
let n = 100000;
{
## warm up
for i in range(0, 10000) {
let a = rand_list(5);
qsort(a);
}
}
{
## benchmark
println("Begin benchmark...");
start = now();
for i in range(0, n) {
let a = rand_list(50);
qsort(a);
}
cost = now() - start;
println("cost: " + cost + " ms, n: " + n);
println(cost/double(n) +" ms/ops");
}