/* Selection Sort * * 15-122 Principles of Imperative Computation */ int find_min(int[] A, int lo, int hi) //@requires 0 <= lo && lo < hi && hi <= \length(A); /*@ensures lo <= \result && \result < hi @ && le_seg(A[\result], A, lo, hi); @*/ { int min = lo; for (int i = lo+1; i < hi; i++) //@loop_invariant lo <= i && i <= hi; //@loop_invariant lo <= min && min < hi; //@loop_invariant le_seg(A[min], A, lo, i); { if (A[i] < A[min]) { min = i; } } return min; } void sort(int[] A, int lo, int hi) //@requires 0 <= lo && lo <= hi && hi <= \length(A); //@ensures is_sorted(A, lo, hi); { for (int i = lo; i < hi; i++) //@loop_invariant lo <= i && i <= hi; //@loop_invariant is_sorted(A, lo, i); //@loop_invariant le_segs(A, lo, i, A, i, hi); { int min = find_min(A, i, hi); swap(A, i, min); } }