home *** CD-ROM | disk | FTP | other *** search
- {
- > I agree... unFortunately the Radix algorithm (which is a
- > sophisticated modification of a Distribution Sort algorithm) is
- > very Complex, highly CPU dependent and highly data dependent.
-
- We must be speaking of a different Radix Sort. Is the sort you are
- talking about sort numbers on the basis of their digits?
-
- > My understanding is that a Radix sort cannot be implemented in
- > Pascal without using a majority of Asm (which means you might as
- > well code the whole thing in Asm.)
-
- > assembly) or dig up some working code, I would love to play With it!
-
- ************************************************************************
- * *
- * Name : Joy Mukherjee *
- * Date : Mar. 26, 1990 *
- * Description : This is the Radix sort implemented in Pascal *
- * *
- ************************************************************************
- }
-
- Program SortStuff;
-
- Uses Crt, Dos;
-
- Type
- AType = Array [1..400] of Integer;
- Ptr = ^Node;
- Node = Record
- Info : Integer;
- Link : Ptr;
- end;
- LType = Array [0..9] of Ptr;
-
- Var
- Ran : AType;
- MaxData : Integer;
-
- Procedure ReadData (Var A : AType; Var MaxData : Integer);
-
- Var I : Integer;
-
- begin
- MaxData := 400;
- For I := 1 to 400 do A [I] := Random (9999);
- end;
-
- Procedure WriteArray (A : AType; MaxData : Integer);
-
- Var I : Integer;
-
- begin
- For I := 1 to MaxData do
- Write (A [I] : 5);
- Writeln;
- end;
-
- Procedure Insert (Var L : LType; Number, LN : Integer);
-
- Var
- P, Q : Ptr;
-
- begin
- New (P);
- P^.Info := Number;
- P^.Link := Nil;
- Q := L [LN];
- if Q = Nil then
- L [LN] := P
- else
- begin
- While Q^.Link <> Nil do
- Q := Q^.Link;
- Q^.Link := P;
- end;
- end;
-
-
- Procedure Refill (Var A : AType; Var L : LType);
- Var
- I, J : Integer;
- P : Ptr;
- begin
- J := 1;
- For I := 0 to 9 do
- begin
- P := L [I];
- While P <> Nil do
- begin
- A [J] := P^.Info;
- P := P^.Link;
- J := J + 1;
- end;
- end;
- For I := 0 to 9 do
- L [I] := Nil;
- end;
-
- Procedure RadixSort (Var A : AType; MaxData : Integer);
- Var
- L : LType;
- I,
- divisor,
- ListNo,
- Number : Integer;
- begin
- For I := 0 to 9 do L [I] := Nil;
- divisor := 1;
- While divisor <= 1000 do
- begin
- I := 1;
- While I <= MaxData do
- begin
- Number := A [I];
- ListNo := Number div divisor MOD 10;
- Insert (L, Number, ListNo);
- I := I + 1;
- end;
- Refill (A, L);
- divisor := 10 * divisor;
- end;
- end;
-
- begin
- ReadData (Ran, MaxData);
- Writeln ('Unsorted : ');
- WriteArray (Ran, MaxData);
- RadixSort (Ran, MaxData);
- Writeln ('Sorted : ');
- WriteArray (Ran, MaxData);
- end.