program sorting;

uses spence,crt,dos,graph;

const
	max = 20;

type
	NumType = array[1..max] of integer;

var
  SortMe    : NumType;
  PushMe    : char;


procedure makelist(var Numbers:NumType);
var
	i : integer;
begin
   randomize;
   for i := 1 to max do
   	Numbers[i] := random(100)+1;

end;

procedure ShowList(Numbers:Numtype);
var
	i    : integer;
  fun  : string[10];

begin
  for i := 1 to max do begin
    gotoxy(winmenu[2].winxloc+1,winmenu[2].winyloc+i+1);
  	write('  ',Numbers[i]:11);
  end;
end;

procedure Selection(var Numbers:NumType);
var
	top   				: integer;
  Big   				: integer;
  i     				: integer;
  temp  				: integer;

begin
	for top := max downto 2 do begin
  	Big := 1;
    for i := 2 to Top do begin
    	if Numbers[i] > Numbers[Big] then
      	Big := i;
      temp := Numbers[Top];
      Numbers[Top] := Numbers[Big];
      Numbers[Big] := temp;
    end;
  end;
  writelnmenu(2,'Selection Sort: ');
  ShowList(sortme);
  gotoxy(23,23);
  textcolor(lightred);
  writelnmenu(3,'');
  writemenu(3,'');
  writemenu(3,'         Press a key');
  gotoxy(10,20);
  readkey;
end;

procedure Bubble(var Numbers:Numtype);
var
  i 		: integer;
  temp  : integer;
  Top   : integer;

begin
  for top := max downto 2 do begin
		for i := 1 to (max-1) do begin
  		if Numbers[i] > Numbers[i+1] then  {Exchange needed}
    		begin
      	  temp 					:= Numbers[i];
        	Numbers[i]  	:= Numbers[i+1];
        	Numbers[i+1]  := temp;
      	end;
  	end;
  end;
  writelnmenu(2,'Bubble Sort: ');
  ShowList(sortme);
  gotoxy(23,23);
  textcolor(lightred);
  writelnmenu(3,'');
  writemenu(3,'');
  writemenu(3,'         Press a key');
  readkey;
end;

procedure ModifiedBubble(var Numbers:NumType);
var
	i      : integer;
  top    : integer;
  temp   : integer;
  sorted : boolean;

begin
   	sorted := false;
  	Top := max;
    while (not sorted) and (top > 1) do begin
    	Sorted := true;
      for i := 1 to top - 1 do
      	if Numbers[i] > Numbers[i+1] then begin
        	sorted := false;
          temp := Numbers[i];
          numbers[i] := numbers[i+1];
          numbers[i+1] := temp
      end;
     top := top - 1
    end;
  writelnmenu(2,'Modified Bubble: ');
  ShowList(sortme);
  gotoxy(23,23);
  textcolor(lightred);
  writelnmenu(3,'');
  writemenu(3,'');
  writemenu(3,'         Press a key');
  readkey;
end;

procedure Insertion(var Numbers:Numtype);
var
	temp 	  : integer;
  Top     : integer;
  i			  : integer;
  located : boolean;

begin
  for Top := 2 to max do begin
  	temp := Numbers[Top];
    located := false;
    i := Top;
    while not Located do
    	if i = 1 then
      	Located := true
      else
        if temp >= Numbers[i-1] then
					Located := true
        else begin
          Numbers[i] := Numbers[i-1];
          i :=i - 1
        end;
  	Numbers[I] := temp;
 	end;
 	writelnmenu(2,'Insertion Sort: ');
  ShowList(sortme);
  gotoxy(23,23);
  textcolor(lightred);
  writelnmenu(3,'');
  writemenu(3,'');
  writemenu(3,'         Press a key');
  readkey;
end;

procedure ModifiedInsert(Numbers:NumType);
begin

end;

procedure DrawMain;
begin
		writelnmenu(1,'      Pick a Sort:');
    writemenu(1,' 1. Selection Sort');
    writemenu(1,' 2. Bubble Sort');
    writemenu(1,' 3. Modified Bubble Sort');
    writemenu(1,' 4. Insertion Sort');
    writemenu(1,' 5. Quit');
    writemenu(1,'');
    writemenu(1,'       Created by ');
    writemenu(1,'     Phil Spencer on');
    writemenu(1,'        11/11/99');
end;

begin
  StartGraph;
  SpenceLogo(true);
  closegraph;
  repeat
    ClearMenu;
  	menu(10,1,40,15,'Menu',lightBlue);
  	menu(43,1,63,max+3,'# List:',Green);
    menu(10,16,40,23,'Status',Lightred);
    makelist(SortMe);
  	writelnmenu(2,'  Unsorted:');
  	Showlist(sortme);
    DrawMain;
    PushMe := readkey;
    case PushMe of
    	'1' : Selection(SortMe);
      '2' : Bubble(SortMe);
      '3' : ModifiedBubble(Sortme);
      '4' : Insertion(SortMe);
      '5' :
    else begin
    		writelnmenu(3,'');
  			writemenu(3,'');
  			writemenu(3,'           1 to 5!');
        writemenu(3,'         Press a key');
        readkey;
    	end;
    end;
  until(PushMe = '5');
end.


