var var_sort = func() {
    srand(); # be aware! this causes global changes
    var quick_sort_core = func(vec,left,right) {
        if (left>=right) return nil;
        var base=left+int(rand()*(right-left));
        (vec[left],vec[base])=(vec[base],vec[left]);
        var (i,j,tmp)=(left,right,vec[left]);
        while(i<j) {
            while(i<j and tmp<vec[j])
                j-=1;
            vec[i]=vec[j];
            while(i<j and vec[i]<tmp)
                i+=1;
            vec[j]=vec[i];
            j-=1;
        }
        vec[i]=tmp;
        quick_sort_core(vec,left,i-1);
        quick_sort_core(vec,i+1,right);
        return nil;
    }
    return func(vec) {
        quick_sort_core(vec,0,size(vec)-1);
        return nil;
    }
}();

var vec = [];
setsize(vec, 1e4);
rand(time(0));
for(var i=0;i<1e4;i+=1)
    vec[i] = int(rand()*1e5);
sort(vec);
for(var i=1;i<1e4;i+=1) {
    if (vec[i]<vec[i-1]) {
        die("incorrect sort result");
    }
}

var test = func(n) {
    var a=[];
    setsize(a,n);
    for(var i=0;i<n;i+=1) {
        a[i]=int(rand()*n);
    }
    var ts=maketimestamp();
    ts.stamp();
    var_sort(a);
    println("[time] ",str(n)," in ",ts.elapsedMSec()/1000," sec (direct cmp)");

    var a=[];
    setsize(a,n);
    for(var i=0;i<n;i+=1) {
        a[i]=int(rand()*n);
    }
    ts.stamp();
    sort(a);
    println("[time] ",str(n)," in ",ts.elapsedMSec()/1000," sec (lambda cmp)");
}

for(var i=1000;i<1e6;i*=10) {
    test(i);
}