(*~\Глагол\Приложения\Упорядочивание\~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
(**)                           ОТДЕЛ Упорядочивание+;
(*============================================================================*
 * НАЗНАЧЕНИЕ:
 *            проверка упорядочивания рядов (при помощи генератора случ.чисел)
 *============================================================================*)

ИСПОЛЬЗУЕТ 
  ОС      ИЗ "..\..\Отделы\Обмен\",

  НаЭкран ИЗ "..\..\Отделы\Обмен\ВводВывод\",

  Вставкой,
  Вставкой2,
  Выбором,
  Обменом,
  ОбменомБ,

 цМатем   ИЗ "..\..\Отделы\ЧисАн\32\ц\",
 дМатем   ИЗ "..\..\Отделы\ЧисАн\64\д\";

ПОСТ
                 (* алгоритмы упорядочивания *)
  упВставкой = 0;
  упВставкой2= 1;
  упВыбором  = 2;
  упОбменом  = 3;
  упОбменомБ = 4;
                 (* число повторов упорядочивания короткого ряда *)
  Повторов = 10000;

ПЕР
  короткийРяд:РЯД 30    ИЗ ЦЕЛ;
  длинныйРяд :РЯД 30000 ИЗ ЦЕЛ;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Вывести(ряд+:РЯД ИЗ ЦЕЛ);        (* вывод на экран всех слагаемых ряда *)
ПЕР
  поз:ЦЕЛ;
УКАЗ
  ОТ поз:=0 ДО РАЗМЕР(ряд)-1 ВЫП
    НаЭкран.Цел4числа("%d ",ряд[поз],0,0,0)
  КОН;
  НаЭкран.ВсяЦепь("^")
КОН Вывести;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Заполнить(ряд+:РЯД ИЗ ЦЕЛ);      (* заполнение ряда случайными числами *)
ПЕР
  поз:ЦЕЛ;
УКАЗ
  ОТ поз:=0 ДО РАЗМЕР(ряд)-1 ВЫП
    ряд[поз]:=УЗК(ВШИРЦЕЛ(дМатем.случ()*РАЗМЕР(ряд)))
  КОН
КОН Заполнить;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Испытание(Алгоритм:ЗАДАЧА(ряд+:РЯД ИЗ ЦЕЛ));
                              (* испытание заданного алгоритма упорядочивания *)
ПЕР
  повтор:ЦЕЛ;
  начВремя,время:ЦЕЛ;
УКАЗ                        (* выставка генератора случ.чисел в 0, чтобы была
                                одинаковая последовательность случайных чисел *)
  цМатем.случ0(0); 
                                      (* повторяем упорядочивание малого ряда *)
  время:=0;
  ОТ повтор:=1 ДО Повторов ВЫП
    Заполнить(короткийРяд);
    начВремя:=ОС.Время();
    Алгоритм(короткийРяд);
    УВЕЛИЧИТЬ(время,ОС.Время()-начВремя)
  КОН;
  НаЭкран.Цел4числа("%d рядов из %d целых чисел за %dмс^",Повторов,РАЗМЕР(короткийРяд),время,0);
  Вывести(короткийРяд);
                                                 (* упорядочиваем большой ряд *)
  Заполнить(длинныйРяд);
  начВремя:=ОС.Время();
  Алгоритм(длинныйРяд);
  время:=ОС.Время()-начВремя;
  НаЭкран.Цел4числа("ряд из %d целых чисел за %dмс^",РАЗМЕР(длинныйРяд),время,0,0)
КОН Испытание;

(*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
ЗАДАЧА Испытания;            (* испытания  в с е х  алгоритмов упорядочивания *)
ПЕР
  алгоритм:ЦЕЛ;
УКАЗ
  ОТ алгоритм:=упВставкой ДО упОбменомБ ВЫП
    ВЫБРАТЬ алгоритм ИЗ
    | упВставкой:  
        НаЭкран.ВсяЦепь("^Упорядочивание простой вставкой^"); 
        Испытание(Вставкой.Упорядочить)
    | упВставкой2: 
        НаЭкран.ВсяЦепь("^Упорядочивание двоичной вставкой^"); 
        Испытание(Вставкой2.Упорядочить)
    | упВыбором: 
        НаЭкран.ВсяЦепь("^Упорядочивание простым выбором^"); 
        Испытание(Выбором.Упорядочить)
    | упОбменом: 
        НаЭкран.ВсяЦепь("^Упорядочивание простым обменом^"); 
        Испытание(Обменом.Упорядочить)
    | упОбменомБ: 
        НаЭкран.ВсяЦепь("^Упорядочивание быстрым обменом^"); 
        Испытание(ОбменомБ.Упорядочить)
    ИНАЧЕ
    КОН
  КОН
КОН Испытания;

(*-++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++-*)
УКАЗ
  Испытания
КОН Упорядочивание.
