<?xml version="1.0"?>
<paste-with-annotations>
  <paste>
    <number>
      <integer>87801</integer>
    </number>
    <user>
      <string>etate</string>
    </user>
    <title>
      <string>qsort</string>
    </title>
    <contents>
      <string>module: qsort

define constant &lt;int&gt; = limited(&lt;integer&gt;);
define constant &lt;int-vector&gt; = limited(&lt;simple-vector&gt;, of: &lt;integer&gt;);

define sealed inline method rnd (x :: &lt;int&gt;) 
 =&gt; (&lt;int&gt;);
  random(x);
end;

define sealed inline method swap (a :: &lt;int-vector&gt;, p :: &lt;int&gt;, q :: &lt;int&gt;)
 =&gt; (object);
  let tmp :: &lt;int&gt; = a[p];
  a[p] := a[q];
  a[q] := tmp;
end;

define sealed inline method partition (a :: &lt;int-vector&gt;, p :: &lt;int&gt;, q :: &lt;int&gt;) 
 =&gt; (&lt;int&gt;);
  let f :: &lt;int&gt; = p + rnd(q - p);
  swap(a, p, f);

  let pivot :: &lt;int&gt; = a[p];
  let i :: &lt;int&gt; = p;
  for (j from (p + 1) below q)
    if (a[j] &lt;= pivot)
      i := i + 1;
      swap(a, i, j);
    end if;
  end;
  swap(a, p, i);
  i
end;
    
define sealed inline method quicksort (a :: &lt;int-vector&gt;, p :: &lt;int&gt;, q :: &lt;int&gt;)
  if (p &lt; q)
    let r :: &lt;int&gt; = partition(a, p, q);
    quicksort(a, p, r - 1);
    quicksort(a, r + 1, q);
  end;
end;

//
begin
  let N :: &lt;int&gt; = 10000000;
  let test :: &lt;int-vector&gt; = make(&lt;int-vector&gt;, size: N, fill: 0);
  
  for(i from 0 below N)
    test[i] := rnd(N);
  end;

  quicksort(test, 0, N - 1);
end;
</string>
    </contents>
    <universal-time>
      <integer>3463051617</integer>
    </universal-time>
    <channel>
      <string>#dylan</string>
    </channel>
    <colorization-mode>
      <string>None</string>
    </colorization-mode>
    <maybe-spam>
      <null/>
    </maybe-spam>
    <is-unicode>
      <keyword>TRUE</keyword>
    </is-unicode>
    <deletion-requested>
      <null/>
    </deletion-requested>
    <deletion-requested-email>
      <null/>
    </deletion-requested-email>
    <expiration-time>
      <null/>
    </expiration-time>
  </paste>
</paste-with-annotations>
