A.18.26 Array Sorting
The language-defined generic procedures Containers.Generic_Array_Sort, 
Containers.Generic_Constrained_Array_Sort, and Containers.Generic_Sort 
provide sorting on arbitrary array types. 
Static Semantics
The generic library 
procedure Containers.Generic_Array_Sort has the following declaration: 
generic
   type Index_Type 
is (<>);
   
type Element_Type 
is private;
   
type Array_Type 
is array (Index_Type 
range <>) 
of Element_Type;
   
with function "<" (Left, Right : Element_Type)
      
return Boolean 
is <>;
procedure Ada.Containers.Generic_Array_Sort (Container : 
in out Array_Type);
pragma Pure(Ada.Containers.Generic_Array_Sort);
 
Reorders the elements of Container such that the 
elements are sorted smallest first as determined by the generic formal 
"<" operator provided. Any exception raised during evaluation 
of "<" is propagated.
The actual function for the generic formal function 
"<" of Generic_Array_Sort is expected to return the same 
value each time it is called with a particular pair of element values. 
It should define a strict weak ordering relationship (see 
A.18); 
it should not modify Container. If the actual for "<" behaves 
in some other manner, the behavior of the instance of Generic_Array_Sort 
is unspecified. The number of times Generic_Array_Sort calls "<" 
is unspecified.
 
The generic library 
procedure Containers.Generic_Constrained_Array_Sort has the following 
declaration: 
generic
   type Index_Type 
is (<>);
   
type Element_Type 
is private;
   
type Array_Type 
is array (Index_Type) 
of Element_Type;
   
with function "<" (Left, Right : Element_Type)
      
return Boolean 
is <>;
procedure Ada.Containers.Generic_Constrained_Array_Sort
      (Container : 
in out Array_Type);
pragma Pure(Ada.Containers.Generic_Constrained_Array_Sort);
 
Reorders the elements of Container such that the 
elements are sorted smallest first as determined by the generic formal 
"<" operator provided. Any exception raised during evaluation 
of "<" is propagated.
The actual function for the generic formal function 
"<" of Generic_Constrained_Array_Sort is expected to return 
the same value each time it is called with a particular pair of element 
values. It should define a strict weak ordering relationship (see 
A.18); 
it should not modify Container. If the actual for "<" behaves 
in some other manner, the behavior of the instance of Generic_Constrained_Array_Sort 
is unspecified. The number of times Generic_Constrained_Array_Sort calls 
"<" is unspecified.
 
  The generic library 
procedure Containers.Generic_Sort has the following declaration: 
generic
   type Index_Type 
is (<>);
   
with function Before (Left, Right : Index_Type) 
return Boolean;
   
with procedure Swap (Left, Right : 
in Index_Type);
procedure Ada.Containers.Generic_Sort
      (First, Last : Index_Type'Base);
pragma Pure(Ada.Containers.Generic_Sort);
 
Reorders the elements of an indexable structure, 
over the range First .. Last, such that the elements are sorted in the 
ordering determined by the generic formal function Before; Before should 
return True if Left is to be sorted before Right. The generic formal 
Before compares the elements having the given indices, and the generic 
formal Swap exchanges the values of the indicated elements. Any exception 
raised during evaluation of Before or Swap is propagated.
The actual function for the generic formal function 
Before of Generic_Sort is expected to return the same value each time 
it is called with index values that identify a particular pair of element 
values. It should define a strict weak ordering relationship (see 
A.18); 
it should not modify the elements. The actual function for the generic 
formal Swap should exchange the values of the indicated elements. If 
the actual for either Before or Swap behaves in some other manner, the 
behavior of Generic_Sort is unspecified. The number of times the Generic_Sort 
calls Before or Swap is unspecified.
 
Implementation Advice
 The worst-case time complexity of a call on an instance 
of Containers.Generic_Array_Sort or Containers.Generic_Constrained_Array_Sort 
should be O(N**2) or better, and the average time complexity 
should be better than O(N**2), where N is the length 
of the Container parameter. 
 Containers.Generic_Array_Sort and Containers.Generic_Constrained_Array_Sort 
should minimize copying of elements. 
 The worst-case time complexity of a call on an instance 
of Containers.Generic_Sort should be O(N**2) or better, 
and the average time complexity should be better than O(N**2), 
where N is the difference between the Last and First parameters 
plus 1. 
 Containers.Generic_Sort should minimize calls to 
the generic formal Swap. 
Ada 2005 and 2012 Editions sponsored in part by Ada-Europe