Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

SALAST / COMMONS

.PAS
Скачиваний:
15
Добавлен:
16.04.2013
Размер:
5 Кб
Скачать
{ Лабораторная работа по АиСД           }
{Александра Циммермана                  }
{Суть - реализация алгоритма сортировки }
{ методом СЛИЯНИЯ & СЛИЯНИЯ-подобных    }
{ Typed at 20.09.1996                   }
{модуль общих перем.,констант e.c.      }

Unit Commons;

Interface
Uses WObjects,WinTypes,WinProcs;
{$D CopyRight '96 by A.Tsimmerman}
{$R SortAll}
{$I SortAll.inc}
Function  GetMaxInCollection : Real;
Procedure Sh(W : Real;P : PChar);
Function Log2(X : Real) : Real;
Function TestTheWest (hWindow : hWnd;SortNo : Integer) : Boolean;
Function Solution (N : Word; PercentOfMax : Real) : Word;
Type TBig = Array [1..30000] Of Word;
     PBig = ^TBig;

Const SortNum = 8;
      MassiwTypes = 5;
      MassiwTypes1 = 7;
 Const SortCurrent : Word = 0;
Const
  SortName   : Array [0..SortNum] Of PChar =
    ('Отсутствует'     ,'Естественным двухпутевым слиянием',
     'Простой вставкой','Быстрая Хоара',
     'Шелла(бинарный обмен)','"Пузырьком"(стандартный обмен)',
     'Простым выбором','Бинарной вставкой','Интерполяционной вставкой');
  Difficult      : Array [0..SortNum] Of PChar =
    ('<НЕИЗВЕСТНА>','O(n*log2(n))','O(n^2)',
     'O(n*log2(n))','O(n*log2(n)^2)','O(n^2)',
     'O(n^2)',      'O(n^2)',      'O(n^2)');
  HighLimit      : Array [0..SortNum] Of PChar =
    ('<НЕИЗВЕСТНО>','30000',      '4000',
     '30000'       ,'30000',       '4000',
     '4000'        ,'9000',      '9000');
  HighLimitW     : Array [0..SortNum] Of Word =
    ( 0,             30000 ,       4000 ,
      30000 ,        30000 ,        4000 ,
      4000  ,        9000,         9000);
  TypeMassiw     : Array [1..4] Of PChar =
    ('НЕТ','произвольный','возрастающий','убывающий');
  SortBestTypeMassiw  : Array [0..SortNum] Of Word =
    (1,3,3,2,3,3,1,3,3);
  SortWorstTypeMassiw : Array [0..SortNum] Of Word =
    (1,2,4,3,2,4,1,4,4);
  TypeRequare    : Array [1..4] Of PChar =
    (' ','Использует только исходный массив',
     'Дополнительный массив длины N','Большой стек из-за рекурсивности');
  SortTypeRequare: Array [0..SortNum] Of Word =
    (1,3,2,4,3,2,3,2,2);
  DirectionName   : Array [0..1] Of PChar =
    ('обратное','прямое');
  ElMas      : Array [1..MassiwTypes] Of PChar =
    ('Могут быть совпадающие','Все различные','Все одинаковые',
     'Benchmarck #1','Benchmarck #2');
  ElDiap    : Array [1..MassiwTypes1] Of PChar =
    ('Равномерно','Около среднего','M(A) = 10% от Mmax',
      'M(A) = 25% от Mmax','M(A) = 50% от Mmax','M(A) = 75% от Mmax',
      'M(A) = 90% от Mmax');
  MaxNum     : Word = 30000;
  AppName    : PChar = 'Sort';
  HasMassiw  : Boolean = False; {is really array exist ?}
Var Massiw,Field,Trans : PBig;
    HasSoundAtAll : Boolean;
    HasSound : Boolean;
    HasBMP   : Boolean;
Type
  TParams = Record
   Length : Array [0..5] Of Char;
   Value  : Array [0..5] Of Char;
   Col    : PCollection;
   Sel    : Integer;
   Col2   : PCollection;
   Sel2   : Integer;
   LengthW: Word;
   ValueW : Word;
           End;
Var Params : TParams;

Type
  TResult = Record
   Method  : Array [0..40] Of Char;
   StElMas : Array [0..30] Of Char;
   StElDiap: Array [0..30] Of Char;
   Length  : Array [0..5] Of Char;
   Value   : Array [0..5] Of Char;
   SortTime: Array [0..9] Of Char;
   Direction:Array [0..10] Of Char;
           End;
Var Result : TResult;

Type TSortParams = Record
       Direct : Word;
       Reverse: Word;
       SaveIt : Word;
                   End;
Var SP : TSortParams;

Type
  TMInfo = Record
   Col    : PCollection;
   Sel    : Integer;
           End;
Var MInfo : TMInfo;
Type
  PGraphicPoint = ^TGraphicPoint;
  TGraphicPoint = Record
       _SortIndex  : Word;
       _ElMasIndex : Word;
       _ElDiapIndex: Word;
       _SortTime   : Array [0..9] Of Char;
       _SortTimeR  : Real;
       _LengthW    : Word;
       _ValueW     : Word;
       _Length     : Array [0..5] Of Char;
       _Value      : Array [0..5] Of Char;
       _DirIndex   : Word;
                     End;

Var Graphic : PCollection;

Implementation

  Function GetMaxInCollection : Real;
   Var P : PGraphicPoint;
       i : Integer;
     Max : Real;
   Begin
    Max := 0.00;
    For i := 0 To Graphic^.Count-1 Do
     Begin
      P := Graphic^.At(i);
      If Max<P^._SortTimeR Then Max := P^._SortTimeR;
     End;
    GetMaxInCollection := Max;
   End;

  Procedure Sh(W : Real;P : PChar);
   Var St :String;
   Begin
    Str(W:5:2,St);
    St[Length(St)+1] := #0;
    If MessageBox(0,PChar(Addr(St[1])),P,mb_OKCancel)
             = id_Cancel Then Halt;
   End;

  Function TestTheWest (hWindow : hWnd;SortNo : Integer) : Boolean;
   Begin
    TestTheWest := True;
    SortCurrent := 0;
    If Params.LengthW > HighLimitW[SortNo] Then
     If MessageBox(hWindow,'Заданный массив слишком длинный для этой сортировки.'#13#10'Прервать сортировку ?',
                            'Внимание!',mb_YesNo OR mb_IconQuestion) = idYes Then TestTheWest := False;
   End;

  Function Log2(X : Real) : Real;
   Begin
    Log2 := Ln(X)/Ln(2);
   End;

  Function Solution (N : Word; PercentOfMax : Real) : Word;
   Begin
    Solution := Round(N*(1 - Sqrt(1-PercentOfMax))/2);
   End;

 Begin
 End.

Соседние файлы в папке SALAST