As promised, and to be able to show TS that his 'sorting code' was a very good first attempt even though by default it will not end up as an insertion sort.
TS started out with the following:
program Step0;
{$MODE OBJFPC}{$H+}
uses
SysUtils;
var
rank : array[1..10] of integer;
i : integer;
begin
// randomize;
for i:=1 to 10 do
begin
rank[i]:=random(500);
end;
for i:= 2-1 downto 1 do
begin
if rank[2] < rank[i] then
rank[i+1]:=rank[i];
if rank[2]> rank[i] then
rank[i+1]:=rank[2];
end;
for i:= 3-1 downto 1 do
begin
if rank[3] < rank[i] then
rank[i+1]:=rank[i];
if rank[3]> rank[i] then
rank[i+1]:=rank[3];
end;
for i:= 4-1 downto 1 do
begin
if rank[4] < rank[i] then
rank[i+1]:=rank[i];
if rank[4]> rank[i] then
rank[i+1]:=rank[4];
end;
for i:= 5-1 downto 1 do
begin
if rank[5] < rank[i] then
rank[i+1]:=rank[i];
if rank[5]> rank[i] then
rank[i+1]:=rank[5];
end;
for i:=1 to 10 do
begin
writeln(inttostr(rank[i]));
end;
end.
Which produced the following output:
274 422 422 422 422 428 272 423 211 311
Step 1:- Introduce Iter variable to get rid of some hard-coded values
- add missing iterations
program Step1;
{$MODE OBJFPC}{$H+}
uses
SysUtils;
var
rank : array[1..10] of integer;
i : integer;
iter: integer;
begin
// randomize;
for i:=1 to 10 do
begin
rank[i]:=random(500);
end;
Iter := 2;
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
for i:=1 to 10 do
begin
writeln(inttostr(rank[i]));
end;
end.
Which outputs:
274 428 428 428 428 428 428 428 428 428
Step 2:- add a sub-routine that displays the values from the rank array and call this routine in our main program when it's useful
program Step2;
{$MODE OBJFPC}{$H+}
procedure DisplayRanks(ranks: array of integer);
const
iteration : integer = 0;
var
rankindex : integer;
begin
Write(iteration, ' : ');
for rankindex:=Low(ranks) to High(ranks) do
begin
write(ranks[rankindex], ' ');
end;
WriteLn;
inc(Iteration);
end;
var
rank : array[1..10] of integer;
i : integer;
iter: integer;
begin
// randomize;
for i:=1 to 10 do
begin
rank[i]:=random(500);
end;
DisplayRanks(rank);
Iter := 2;
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then
rank[i+1]:=rank[i];
if rank[Iter]> rank[i] then
rank[i+1]:=rank[Iter];
end;
DisplayRanks(rank);
end.
Which outputs:
0 : 274 296 357 422 301 428 272 423 211 311
1 : 274 296 357 422 301 428 272 423 211 311
2 : 274 357 357 422 301 428 272 423 211 311
3 : 274 422 422 422 301 428 272 423 211 311
4 : 274 422 422 422 422 428 272 423 211 311
5 : 274 428 428 428 428 428 272 423 211 311
6 : 274 428 428 428 428 428 428 423 211 311
7 : 274 428 428 428 428 428 428 428 211 311
8 : 274 428 428 428 428 428 428 428 428 311
9 : 274 428 428 428 428 428 428 428 428 428
Step 3:- add a swaprank sub-routines that swaps two values using the provided indexes in the array (!!).
- Use the new Swaprank routine: That also means we also have to get rid of the unnecessary checks
program Step3;
{$MODE OBJFPC}{$H+}
procedure DisplayRanks(ranks: array of integer);
const
iteration : integer = 0;
var
rankindex : integer;
begin
Write(iteration, ' : ');
for rankindex:=Low(ranks) to High(ranks) do
begin
write(ranks[rankindex], ' ');
end;
WriteLn;
inc(Iteration);
end;
procedure SwapRank(var ranks: array of integer; index1, index2: integer);
var
TempSwapBuffer : integer;
begin
// note: account for zero indexed array
TempSwapBuffer := ranks[Pred(index1)];
ranks[Pred(index1)] := ranks[Pred(index2)];
ranks[Pred(index2)] := TempSwapBuffer;
WriteLn('swap rank[',index1,'] with rank[',index2,']');
end;
var
rank : array[1..10] of integer;
i : integer;
iter: integer;
begin
// randomize;
for i:=1 to 10 do
begin
rank[i]:=random(500);
end;
DisplayRanks(rank);
Iter := 2;
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
inc(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
end.
which outputs:
0 : 274 296 357 422 301 428 272 423 211 311
1 : 274 296 357 422 301 428 272 423 211 311
2 : 274 296 357 422 301 428 272 423 211 311
3 : 274 296 357 422 301 428 272 423 211 311
swap rank[5] with rank[4]
4 : 274 296 357 301 422 428 272 423 211 311
5 : 274 296 357 301 422 428 272 423 211 311
swap rank[7] with rank[6]
6 : 274 296 357 301 422 272 428 423 211 311
swap rank[8] with rank[7]
7 : 274 296 357 301 422 272 423 428 211 311
swap rank[9] with rank[8]
8 : 274 296 357 301 422 272 423 211 428 311
swap rank[10] with rank[9]
9 : 274 296 357 301 422 272 423 211 311 428
Step 4:- Still something wrong with the sorting. We Iterate from narrow to wide while it should be from wide to narrow. We fix that.
program Step4;
{$MODE OBJFPC}{$H+}
procedure DisplayRanks(ranks: array of integer);
const
iteration : integer = 0;
var
rankindex : integer;
begin
Write(iteration, ' : ');
for rankindex:=Low(ranks) to High(ranks) do
begin
write(ranks[rankindex], ' ');
end;
WriteLn;
inc(Iteration);
end;
procedure SwapRank(var ranks: array of integer; index1, index2: integer);
var
TempSwapBuffer : integer;
begin
// note: account for zero indexed array
TempSwapBuffer := ranks[Pred(index1)];
ranks[Pred(index1)] := ranks[Pred(index2)];
ranks[Pred(index2)] := TempSwapBuffer;
WriteLn('swap rank[',index1,'] with rank[',index2,']');
end;
var
rank : array[1..10] of integer;
i : integer;
iter: integer;
begin
// randomize;
for i:=1 to 10 do
begin
rank[i]:=random(500);
end;
DisplayRanks(rank);
Iter := 10;
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
dec(Iter);
for i:= Iter-1 downto 1 do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
end.
which outputs:
0 : 274 296 357 422 301 428 272 423 211 311
swap rank[10] with rank[8]
swap rank[10] with rank[6]
1 : 274 296 357 422 301 423 272 311 211 428
swap rank[9] with rank[8]
swap rank[9] with rank[6]
2 : 274 296 357 422 301 311 272 211 423 428
swap rank[8] with rank[7]
swap rank[8] with rank[6]
swap rank[8] with rank[4]
3 : 274 296 357 311 301 272 211 422 423 428
swap rank[7] with rank[6]
swap rank[7] with rank[5]
swap rank[7] with rank[4]
swap rank[7] with rank[3]
4 : 274 296 311 301 272 211 357 422 423 428
swap rank[6] with rank[5]
swap rank[6] with rank[4]
swap rank[6] with rank[3]
5 : 274 296 301 272 211 311 357 422 423 428
swap rank[5] with rank[4]
swap rank[5] with rank[3]
6 : 274 296 272 211 301 311 357 422 423 428
swap rank[4] with rank[3]
swap rank[4] with rank[2]
7 : 274 272 211 296 301 311 357 422 423 428
swap rank[3] with rank[2]
swap rank[3] with rank[1]
8 : 272 211 274 296 301 311 357 422 423 428
swap rank[2] with rank[1]
9 : 211 272 274 296 301 311 357 422 423 428
huh ? wait ? what ? a sorted array ?
Step 5:- re-organize main iterations into a loop.
- get rid of some other hard-coded values
program Step5;
{$MODE OBJFPC}{$H+}
procedure DisplayRanks(ranks: array of integer);
const
iteration : integer = 0;
var
rankindex : integer;
begin
Write(iteration, ' : ');
for rankindex:=Low(ranks) to High(ranks) do
begin
Write(ranks[rankindex], ' ');
end;
WriteLn;
inc(Iteration);
end;
procedure SwapRank(var ranks: array of integer; index1, index2: integer);
var
TempSwapBuffer : integer;
begin
// note: account for zero indexed array
TempSwapBuffer := ranks[Pred(index1)];
ranks[Pred(index1)] := ranks[Pred(index2)];
ranks[Pred(index2)] := TempSwapBuffer;
WriteLn('swap rank[',index1,'] with rank[',index2,']');
end;
var
rank : array[1..10] of integer;
i : integer;
iter: integer;
begin
// randomize;
for i:=Low(Rank) to High(Rank) do
begin
rank[i]:=random(500);
end;
DisplayRanks(rank);
for Iter:= High(rank) downto Succ(Low(Rank)) do
begin
for i:= Pred(Iter) downto Low(rank) do
begin
if rank[Iter] < rank[i] then SwapRank(rank, Iter, i);
end;
DisplayRanks(rank);
end;
end.
Which (still) outputs:
0 : 274 296 357 422 301 428 272 423 211 311
swap rank[10] with rank[8]
swap rank[10] with rank[6]
1 : 274 296 357 422 301 423 272 311 211 428
swap rank[9] with rank[8]
swap rank[9] with rank[6]
2 : 274 296 357 422 301 311 272 211 423 428
swap rank[8] with rank[7]
swap rank[8] with rank[6]
swap rank[8] with rank[4]
3 : 274 296 357 311 301 272 211 422 423 428
swap rank[7] with rank[6]
swap rank[7] with rank[5]
swap rank[7] with rank[4]
swap rank[7] with rank[3]
4 : 274 296 311 301 272 211 357 422 423 428
swap rank[6] with rank[5]
swap rank[6] with rank[4]
swap rank[6] with rank[3]
5 : 274 296 301 272 211 311 357 422 423 428
swap rank[5] with rank[4]
swap rank[5] with rank[3]
6 : 274 296 272 211 301 311 357 422 423 428
swap rank[4] with rank[3]
swap rank[4] with rank[2]
7 : 274 272 211 296 301 311 357 422 423 428
swap rank[3] with rank[2]
swap rank[3] with rank[1]
8 : 272 211 274 296 301 311 357 422 423 428
swap rank[2] with rank[1]
9 : 211 272 274 296 301 311 357 422 423 428
Not very interesting, unless you are TS i guess
