/* 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 le_seg(A[\result], A, lo, hi);
{
  int min = lo;
  for (int i = lo+1; i < hi; 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 mini = find_min(A, i, hi);
    swap(A, i, mini);
  }
}