Обратите внимание, что по большинству таких вопросов вы можете просто обратиться к Rosetta Code Wiki . Я адаптировал свой ответ из записи для сортировки целых чисел.
На языке программирования системы делать что-то подобное, как правило, будет сложнее, чем с помощью специализированного языка обработки строк. К счастью для Ады, в самой последней версии есть подпрограмма библиотеки именно для такого рода задач.
Для Ады 2005 я думаю, что вы могли бы сделать что-то вроде следующего (предупреждение, не скомпилировано!):
type String_Array is array(Natural range <>) of Ada.Strings.Unbounded.Unbounded_String;
function "<" (L, R : Ada.Strings.Unbounded.Unbounded_String) return boolean is
begin
--// Natural ordering predicate here. Sorry to cheat in this part, but
--// I don't exactly grok the requirement for "natural" ordering. Fill in
--// your proper code here.
end "<";
procedure Sort is new Ada.Containers.Generic_Array_Sort
(Index_Type => Natural;
Element_Type => Ada.Strings.Unbounded.Unbounded_String,
Array_Type => String_Array
);
Пример использования:
using Ada.Strings.Unbounded;
Example : String_Array := (To_Unbounded_String ("Joe"),
To_Unbounded_String ("Jim"),
To_Unbounded_String ("Jane"),
To_Unbounded_String ("Fred"),
To_Unbounded_String ("Bertha"),
To_Unbounded_String ("Joesphus"),
To_Unbounded_String ("Jonesey"));
begin
Sort (Example);
...
end;