Sorting with an Index Array
Here are examples of two InsertSort algorithms written in
Pascal. The first just swaps list elements. The second swaps
elements of an index array instead.
After each algorithm, I've inserted code that could be used to
print out the sorted list.
(****************************************************)
(* INSERTSORT *)
(****************************************************)
PROCEDURE InsertSort (VAR DataList : ArrayType;
NumElements : Integer);
VAR
Inner, Outer : Integer;)
PlaceFound : Boolean;
BEGIN (* InsertSort *)
Outer := 2;
WHILE Outer <= NumElements DO
BEGIN
Inner := Outer;
PlaceFound := False;
WHILE (Inner > 1)
AND NOT PlaceFound DO
BEGIN
IF DataList[Inner] < DataList[Inner - 1] (* WILL CHANGE *)
THEN
BEGIN
Swap(DataList[Inner], DataList[Inner-1]); (* WILL CHANGE *)
Inner := Inner - 1
END (* IF out of place *)
ELSE PlaceFound := TRUE
END; (* WHILE inner loop *)
Outer := Outer + 1
END (* outer loop *)
END; (* InsertSort *)
PROCEDURE PrintList(VAR DataList : ArrayType;
NumElements : Integer) ;
VAR
position : integer ;
BEGIN
FOR position := 1 TO NumElements DO
write(DataList[position]) (* WILL CHANGE *)
END ;
(****************************************************)
(* ** INDEX ** INSERTSORT *)
(****************************************************)
PROCEDURE InsertSort (VAR DataList : ArrayType;
VAR IndexArray : IntArrType ;
NumElements : Integer);
VAR
Inner, Outer : Integer;)
PlaceFound : Boolean;
BEGIN (* InsertSort *)
Outer := 2;
WHILE Outer <= NumElements DO
BEGIN
Inner := Outer;
PlaceFound := False;
WHILE (Inner > 1) AND NOT PlaceFound DO
BEGIN
IF DataList[IndexArray[Inner]] (* DIFFERENCE HERE *)
< DataList[IndexArray[Inner-1]] (* DIFFERENCE HERE *)
THEN
BEGIN
Swap(IndexArray[Inner], (* DIFFERENCE HERE *)
IndexArray[Inner-1]); (* DIFFERENCE HERE *)
Inner := Inner - 1
END (* IF out of place *)
ELSE PlaceFound := TRUE
END; (* WHILE inner loop *)
Outer := Outer + 1
END (* outer loop *)
END; (* InsertSort *)
PROCEDURE PrintList ( VAR DataList : ArrayType;
VAR IndexArray : IntArrType ;
NumElements : Integer);
VAR
position : integer ;
BEGIN
FOR position := 1 TO NumElements DO
write(DataList[IndexArray[position]]) (* DIFFERENCE HERE *)
END ;