/** * Quicksort * * 15-122 Principles of Imperative Computation */ int partition(int[] A, int lo, int pi, int hi) //@requires 0 <= lo && lo <= pi && pi < hi && hi <= \length(A); //@ensures lo <= \result && \result < hi; //@ensures ge_seg(A[\result], A, lo, \result); //@ensures le_seg(A[\result], A, \result, hi); { int pivot = A[pi]; swap(A, pi, lo); int left = lo + 1; int right = hi; while (left < right) //@loop_invariant lo <= left && left <= right && right <= hi; //@loop_invariant ge_seg(pivot, A, lo, left); //@loop_invariant le_seg(pivot, A, right, hi); //@loop_invariant pivot == A[lo]; { if (A[left] <= pivot) { left++; } else { //@assert A[left] > pivot; swap(A, left, right-1); right--; } } //@assert left == right; swap(A, lo, left-1); return left-1; } void sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { if (hi - lo <= 1) return; int pi = lo + (hi - lo)/2; //@assert lo <= pi && pi < hi; int mid = partition(A, lo, pi, hi); sort(A, lo, mid); sort(A, mid+1, hi); return; }