home *** CD-ROM | disk | FTP | other *** search
- {
- MARK OUELLET
-
- > I code these things this way:
- >
- > for I := 1 to MAX-1 do
- > for J := I+1 to MAX do
- > if A[I] < A[J] then
- > begin
- > ( swap code )
- > end
-
- this can be improved even more. By limiting the MAX value on each
- successive loop by keeping track of the highest swaped pair.
-
- If on a particular loop, no swap is performed from element MAX-10
- onto the end. Then the next loop does not need to go anyhigher than
- MAX-11. Remember you are moving the highest value up, if no swap is
- performed from MAX-10 on, it means all values above MAX-11 are in order
- and all values below MAX-10 are smaller than MAX-10.
- }
-
- {$X+}
- program MKOSort;
-
- USES
- Crt;
-
- Const
- MAX = 1000;
-
- var
- A : Array[1..MAX] of word;
- Loops : word;
-
- procedure Swap(Var A1, A2 : word);
- var
- Temp : word;
- begin
- Temp := A1;
- A1 := A2;
- A2 := Temp;
- end;
-
- procedure working;
- const
- cursor : array[0..3] of char = '\|/-';
- CurrentCursor : byte = 1;
- Update : word = 0;
- begin
- update := (update + 1) mod 2500;
- if update = 0 then
- begin
- DirectVideo := False;
- write(Cursor[CurrentCursor], #13);
- CurrentCursor := ((CurrentCursor + 1) mod 4);
- DirectVideo := true;
- end;
- end;
-
- procedure Bubble;
- var
- Highest,
- Limit, I : word;
- NotSwaped : boolean;
- begin
- Limit := MAX;
- Loops := 0;
- repeat
- I := 1;
- Highest := 2;
- NotSwaped := true;
- repeat
- working;
- if A[I] > A[I + 1] then
- begin
- Highest := I;
- NotSwaped := False;
- Swap(A[I], A[I + 1]);
- end;
- Inc(I);
- until (I = Limit);
- Limit := Highest;
- Inc(Loops);
- until (NotSwaped) or (Limit <= 2);
- end;
-
- procedure InitArray;
- var
- I, J : word;
- Temp : word;
- begin
- randomize;
- for I := 1 to MAX do
- A[I] := I;
- for I := MAX - 1 downto 1 do
- begin
- J := random(I) + 1;
- Swap(A[I + 1], A[J]);
- end;
- end;
-
- procedure Pause;
- begin
- writeln;
- writeln('Press any key to continue...');
- while keypressed do
- readkey;
- while not keypressed do;
- readkey;
- end;
-
- procedure PrintOut;
- var
- I : word;
- begin
- ClrScr;
- For I := 1 to MAX do
- begin
- if WhereY >= 22 then
- begin
- Pause;
- ClrScr;
- end;
- if (WhereX >= 70) then
- Writeln(A[I] : 5)
- else
- Write(A[I] : 5);
- end;
- writeln;
- Pause;
- end;
-
- begin
- ClrScr;
- InitArray;
- PrintOut;
- Bubble;
- PrintOut;
- writeln;
- writeln('Took ', Loops, ' Loops to complete');
- end.