September Morn Update
This commit is contained in:
parent
4e2d22a71d
commit
aac6731f2c
6856 changed files with 141342 additions and 21127 deletions
|
|
@ -1,10 +1,9 @@
|
|||
-----------------------------------------------------------------------
|
||||
-- Generic Quicksort procedure
|
||||
-- Generic Quick_Sort procedure
|
||||
-----------------------------------------------------------------------
|
||||
generic
|
||||
type Element_Type is private;
|
||||
type Index_Type is (<>);
|
||||
type Element_Array is array(Index_Type range <>) of Element_Type;
|
||||
with function "<" (Left, Right : Element_Type) return Boolean is <>;
|
||||
with function ">" (Left, Right : Element_Type) return Boolean is <>;
|
||||
procedure Sort(Item : in out Element_Array);
|
||||
type Element is private;
|
||||
type Index is (<>);
|
||||
type Element_Array is array(Index range <>) of Element;
|
||||
with function "<" (Left, Right : Element) return Boolean is <>;
|
||||
procedure Quick_Sort(A : in out Element_Array);
|
||||
|
|
|
|||
|
|
@ -1,50 +1,44 @@
|
|||
-----------------------------------------------------------------------
|
||||
-- Generic Quicksort procedure
|
||||
-- Generic Quick_Sort procedure
|
||||
-----------------------------------------------------------------------
|
||||
|
||||
procedure Sort (Item : in out Element_Array) is
|
||||
procedure Quick_Sort (A : in out Element_Array) is
|
||||
|
||||
procedure Swap(Left, Right : in out Element_Type) is
|
||||
Temp : Element_Type := Left;
|
||||
procedure Swap(Left, Right : Index) is
|
||||
Temp : Element := A (Left);
|
||||
begin
|
||||
Left := Right;
|
||||
Right := Temp;
|
||||
A (Left) := A (Right);
|
||||
A (Right) := Temp;
|
||||
end Swap;
|
||||
|
||||
Pivot_Index : Index_Type;
|
||||
Pivot_Value : Element_Type;
|
||||
Right : Index_Type := Item'Last;
|
||||
Left : Index_Type := Item'First;
|
||||
|
||||
begin
|
||||
if Item'Length > 1 then
|
||||
Pivot_Index := Index_Type'Val((Index_Type'Pos(Item'Last) + 1 +
|
||||
Index_Type'Pos(Item'First)) / 2);
|
||||
Pivot_Value := Item(Pivot_Index);
|
||||
|
||||
Left := Item'First;
|
||||
Right := Item'Last;
|
||||
loop
|
||||
while Left < Item'Last and then Item(Left) < Pivot_Value loop
|
||||
Left := Index_Type'Succ(Left);
|
||||
end loop;
|
||||
while Right > Item'First and then Item(Right) > Pivot_Value loop
|
||||
Right := Index_Type'Pred(Right);
|
||||
end loop;
|
||||
exit when Left >= Right;
|
||||
Swap(Item(Left), Item(Right));
|
||||
if Left < Item'Last then
|
||||
Left := Index_Type'Succ(Left);
|
||||
end if;
|
||||
if Right > Item'First then
|
||||
Right := Index_Type'Pred(Right);
|
||||
end if;
|
||||
end loop;
|
||||
if Right > Item'First then
|
||||
Sort(Item(Item'First..Index_Type'Pred(Right)));
|
||||
end if;
|
||||
if Left < Item'Last then
|
||||
Sort(Item(Left..Item'Last));
|
||||
end if;
|
||||
if A'Length > 1 then
|
||||
declare
|
||||
Pivot_Value : Element := A (A'First);
|
||||
Right : Index := A'Last;
|
||||
Left : Index := A'First;
|
||||
begin
|
||||
loop
|
||||
while Left < Right and not (Pivot_Value < A (Left)) loop
|
||||
Left := Index'Succ (Left);
|
||||
end loop;
|
||||
while Pivot_Value < A (Right) loop
|
||||
Right := Index'Pred (Right);
|
||||
end loop;
|
||||
exit when Right <= Left;
|
||||
Swap (Left, Right);
|
||||
Left := Index'Succ (Left);
|
||||
Right := Index'Pred (Right);
|
||||
end loop;
|
||||
if Right = A'Last then
|
||||
Right := Index'Pred (Right);
|
||||
Swap (A'First, A'Last);
|
||||
end if;
|
||||
if Left = A'First then
|
||||
Left := Index'Succ (Left);
|
||||
end if;
|
||||
Quick_Sort (A (A'First .. Right));
|
||||
Quick_Sort (A (Left .. A'Last));
|
||||
end;
|
||||
end if;
|
||||
end Sort;
|
||||
end Quick_Sort;
|
||||
|
|
|
|||
|
|
@ -1,13 +1,12 @@
|
|||
with Sort;
|
||||
with Ada.Text_Io;
|
||||
with Ada.Float_Text_IO; use Ada.Float_Text_IO;
|
||||
|
||||
procedure Sort_Test is
|
||||
type Days is (Mon, Tue, Wed, Thu, Fri, Sat, Sun);
|
||||
type Sales is array(Days range <>) of Float;
|
||||
procedure Sort_Days is new Sort(Float, Days, Sales);
|
||||
type Sales is array (Days range <>) of Float;
|
||||
procedure Sort_Days is new Quick_Sort(Float, Days, Sales);
|
||||
|
||||
procedure Print(Item : Sales) is
|
||||
procedure Print (Item : Sales) is
|
||||
begin
|
||||
for I in Item'range loop
|
||||
Put(Item => Item(I), Fore => 5, Aft => 2, Exp => 0);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue