(* TEST: [-asc -tc] *) (* Type definitions *) type string2int: string -> integer type intArray: 1 -> integer type intArrayXinteger: [ intArray: data; integer: index ] type intArrayXinteger2integer: intArrayXinteger -> integer type intArray2Boolean: intArray -> Boolean (* Function declarations They use the above type definitions *) function indexOfSmallest: intArrayXinteger2integer function selectionSort: intArray2Boolean function entry : string2int (* indexOfSmallest *) indexOfSmallest (* as *) (data, startingIndex) := { [ integer: indexOfSmallestSoFar; integer: i ] indexOfSmallestSoFar := startingIndex; i := 0 ; while (i < data._1 ) { if ( data(i) < data(indexOfSmallestSoFar) ) then { indexOfSmallestSoFar := i; } else { i := i; } i := i + 1; } return indexOfSmallestSoFar; } (* selectionSort *) selectionSort(data) := { [ integer: i ] i := 0 ; while (i < data._1 ) { [ integer: index; integer: temp ] index := indexOfSmallest(data,i); temp := data(index); data(index) := data(i); data(i) := temp; i := i + 1; } return true; } (* Function definition entry is the first function called *) entry(arg) := { [ intArray: data; Boolean: _ ] data := reserve data(8); data(0) := 60; data(1) := 80; data(2) := 10; data(3) := 50; data(4) := 30; data(5) := 40; data(6) := 20; data(7) := 70; _ := selectionSort(data); return 0; }