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

SALAST / COMMONS

.PAS
Скачиваний:
14
Добавлен:
16.04.2013
Размер:
5.31 Кб
Скачать
{ Лабораторная работа по АиСД }
{Александра Циммермана }
{Суть - реализация алгоритма сортировки }
{ методом СЛИЯНИЯ & СЛИЯНИЯ-подобных }
{ 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