[16] nat a;
[3] nat steps;

function ShellSort (nat aSize, sizeStep): nat {
    nat i,j,h,s,t,v;

    steps[0] = 7;
    steps[1] = 3;
    steps[2] = 1;

    for(s=0..sizeStep-1) {
        h = steps[s];
        for(i=h..aSize-1) {
            t = a[i];
            j = i;
            v = a[j-h];
            while(j>=h & v>t) {
                a[j] = v;
                j = j-h;
                if(j>=h)
                    v = a[j-h];
            }
            a[j]=t;
	    }
    }
    return 0;
}


thread test{
    nat k;
    a[0] = 9;
    a[1] = 8;
    a[2] = 16;
    a[3] = 15;
    a[4] = 1;
    a[5] = 10;
    a[6] = 2;
    a[7] = 11;
    a[8] = 3;
    a[9] = 4;
    a[10] = 6;
    a[11] = 5;
    a[12] = 14;
    a[13] = 12;
    a[14] = 7;
    a[15] = 13;

    k = ShellSort(16,3);
}