#include "arrays.pi" typedef struct qs { int pivot; int[] array; } qs; @pre true @post sorted(rv, 0, length(rv) - 1) int[] QuickSort(int[] a) { return qsort(a, 0, length(a) - 1); } @pre true @post true int[] qsort(int[] a, int l, int u) declare qs p; { if (l >= u) return a; else { p = partition(a, l, u); a = p.array; a = qsort(a, l, p.pivot - 1); a = qsort(a, p.pivot + 1, u); return a; } } @pre true @post true qs partition(int[] a, int l, int u) declare int pi, pv, i, j, t; qs tmp; { pi = random(l, u); pv = a[pi]; a[pi] = a[u]; a[u] = pv; i = l - 1; for @ true (j = l; j < u; j = j + 1) { if (a[j] <= pv) { i = i + 1; t = a[i]; a[i] = a[j]; a[j] = t; } } t = a[i + 1]; a[i + 1] = a[u]; a[u] = t; tmp.pivot = i + 1; tmp.array = a; return tmp; } @pre l <= u @post l <= rv && rv <= u int random(int l, int u) { /* a placeholder: only the @post is important */ return u; }