Автор: Пользователь скрыл имя, 11 Ноября 2011 в 01:28, курсовая работа
ЗАДАНИЕ: Упорядочить массив чисел в диапазоне от 1 до 100000 по убыванию и возрастанию методом сортировки посредством вставок и слияния.
ЦЕЛЬ  РАБОТЫ: разработать блок-схему алгоритма метода сортировки посредством вставок и слияния, создать схему программы, составить и протестировать программу на языке высокого уровня Delphi, получить результаты сортировки времени и скорости в зависимости от количества вводимых символов, построить графики зависимости в промежутках: [1 … 300], [300 … 5 000], [5 000 ... 10 000
1.Содержание
   1.Содержание курсового проекта……………………………….2
   2.Введение………………………………………………………..5
   3.Теоретическая часть……………………………………………6
         3.1.Сортировка посредством вставок и слияния…………..6
           3.2. Алгоритм поиска.Бинарные атрибуты…………………9
   4.Практическая  часть……………………………………………12
      4.1. Блок схема алгоритма сортировки массива чисел посредством      
                  вставок и слияния простых вставок………………………………12
      4.2. Схема программы сортировки массива чисел посредством встевок 
                   и слияния……………………………………………………………14
4.3. Блок схема алгоритма поиска через бинарные атрибуты 
                заданного образца в упорядоченном массиве……………16
4.4. Схема программы поиска через бинарные атрибуты 
                заданного образца в упорядоченном массиве……………18
      4.5. Описание алгоритма задания элементов массива……….20
        4.6. Текст программы, выполняющей сортировку массива 
              символов способом простых вставок   …………………………..21
       4.7. Описание интерфейса программы……………………………33
       4.8. Таблицы результатов времени и скорости от количества    
                символов;…………………………………………………..34
        4.9. Графики зависимостей времени и скорости от количества
             чисел…………………………………..……………………36
    5.Заключение………………………………………………………39
   6.Список используемой литературы……………………………..40
type
TForm2 = class(TForm)
Label1: TLabel;
Panel1: TPanel;
Label2: TLabel;
Label3: TLabel;
Edit1: TEdit;
Button1: TButton;
StringGrid1: TStringGrid;
Button2: TButton;
StringGrid2: TStringGrid;
Button3: TButton;
StringGrid3: TStringGrid;
GroupBox1: TGroupBox;
Label5: TLabel;
GroupBox2: TGroupBox;
Label8: TLabel;
Label10: TLabel;
Edit2: TEdit;
Button4: TButton;
Memo1: TMemo;
Label4: TLabel;
Memo2: TMemo;
Label6: TLabel;
Label7: TLabel;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
  end; 
type
mas = array of integer;
mas2 = array of array of integer;
var
  Form2: TForm2; 
a:array of integer; //начальный массив
bin_mas : array of array of integer;
bin_mas1 : array of array of integer;
    sr,mass,n,i,j,k,buf,obr:
      
priz:boolean; 
implementation 
{$R *.dfm} 
function IntToBin(n : integer) : mas; // ФУНКЦИЯ ПЕРЕВОДА В ДВОИЧНЫЙ КОД
var
i, x, y : integer;
begin
SetLength(result, 16);
x := n;
y := x;
i := 15;
while (abs(y) >0) do
begin
x := y mod 2; // остаток от деления на 2
y := y div 2;
result[i] := x; // переписываем в массив двоичные числа с конца
i := i-1;
end;
while i >=0 do // заполняем нулями оставшиеся элементы массива
begin
result[i] := 0;
i := i - 1;
end;
end; 
procedure TForm2.Button1Click(Sender: TObject);
var
i : integer;
begin
n:=Strtoint(Edit1.Text);
if (n<1) or (n>10000) then
begin
ShowMessage('Ошибка ввода');
n:=0;
end
else begin
StringGrid1.ColCount:=n;
StringGrid2.ColCount:=n;
StringGrid3.ColCount:=n;
end;
SetLength(a,n);
for i:=0 to n-1 do begin
    StringGrid1.Cells[i,0]:=
    a[i]:=StrToInt(StringGrid1.
    Randomize; 
 
StringGrid2.Cells[i,0]:='';
StringGrid3.Cells[i,0]:='';
  end; 
Label5.Caption:='';
{Button3Click(Button3);
Button2Click(Button2);}
end; 
procedure TForm2.Button2Click(Sender: TObject);
var len,len1,len2,p1,p2,p3:
time1, time2, i, j : integer;
d:array of integer; // отсортированный массив
b:array of integer; // первая половина массива
c:array of integer; // вторая половина массива
mas_bin1 : mas; // двоичный код одного элемента массива
begin
Label5.Caption:=FloatToStr(
time1 := GetTickCount; // время начала сортировки
// Сортировка 
по возрастанию,определение 
len:=Length(a);
len1:=len div 2;
len2:=len-len1;
SetLength(b,len1);
SetLength(c,len2);
SetLength(d, length(a));
for i:=0 to len1-1 do
b[i]:=a[i];
j:=0;
for i:=len1 to len-1 do
begin
c[j]:=a[i];
j:=j+1;
end; 
for i:= 0 to len1-1 do //сортировка вставками массива b и с
begin
buf:= b[i];
j:= i-1;
while (j>=0)and(b[j]>buf) do
begin
b[j+1]:= b[j];
j:= j-1;
end;
b[j+1]:= buf;
 end; 
for i:= 0 to len2-1 do
begin
buf:= c[i];
j:= i-1;
while (j>=0)and(c[j]>buf) do
begin c[j+1]:= c[j];
j:= j-1;
end;
c[j+1]:= buf;
end;
//********* слияние 
********// 
p1 := 0; // для массива b
p2 := 0; // для массива c
p3 := 0;
while (p1 < len1) and (p2 < len2) do
begin
if b[p1] < c[p2] then
begin
d[p3] := b[p1];
inc(p3);
inc(p1);
end
else begin
d[p3] := c[p2];
inc(p3);
inc(p2);
end;
end;
while p1 < len1 do
begin
d[p3] := b[p1];
inc(p3);
inc(p1);
 end; 
while p2 < len2 do
begin
d[p3] := c[p2];
inc(p3);
inc(p2);
 end; 
time2 := GetTickCount; // время окончания сортировки
{инициализируем массив с двоичными кодами}
SetLength(bin_mas, length(d));
for i := 0 to length(d) -1 do
SetLength(bin_mas[i],16);
SetLength(mas_bin1,16); 
for i := 0 to len-1 do // вывод отсортированного массива
begin
    StringGrid2.Cells[i,0]:=
mas_bin1 := IntToBin(d[i]);
for j := 0 to 15 do // переписываем отсортированный массив в двоичном виде
bin_mas[i,j] := mas_bin1[j]; // в mas_bin1 содержится двоичный код каждого элемента отсортированного массива
end;
Label5.Caption := IntToStr(time2-time1) + 'ms';
end; 
procedure TForm2.Button3Click(Sender: TObject);
var  len,len1,len2,p1,p2,p3:
time1, time2, i, j : integer;
d:array of integer;
b:array of integer;
c:array of integer;
mas_bin1 : mas; // двоичный код одного элемента массива
begin
time1 := GetTickCount; // время начала сортировки
// Сортировка 
по убыванию,определение 
len:=Length(a);
len1:=len div 2;
len2:=len-len1;
SetLength(b,len1);
SetLength(c,len2);
SetLength(d, length(a));
for i:=0 to len1-1 do
b[i]:=a[i];
j:=0;
for i:=len1 to len-1 do
begin
c[j]:=a[i];
j:=j+1;
end; 
for i:= 0 to len1-1 do // сортировка вставками массива b и с
begin
buf:= b[i];
j:= i-1;
while (j>=0)and(b[j]<buf) do
begin
b[j+1]:= b[j];
j:= j-1;
end;
b[j+1]:= buf;
 end; 
for i:= 0 to len2-1 do
begin
buf:= c[i];
j:= i-1;
while (j>=0)and(c[j]<buf) do
begin c[j+1]:= c[j];
j:= j-1;
end;
c[j+1]:= buf;
end;
//********* слияние 
********// 
p1 := 0; // для массива b
p2 := 0; // для массива c
p3 := 0;
while (p1 < len1) and (p2 < len2) do
begin
if b[p1] > c[p2] then
begin
d[p3] := b[p1];
inc(p3);
inc(p1);
end
else begin
d[p3] := c[p2];
inc(p3);
inc(p2);
end;
end;
while p1 < len1 do
begin
d[p3] := b[p1];
inc(p3);
inc(p1);
 end; 
while p2 < len2 do
begin
d[p3] := c[p2];
inc(p3);
inc(p2);
 end; 
time2 := GetTickCount; // время окончания сортировки
SetLength(bin_mas1, length(d));
for i := 0 to length(d) -1 do
SetLength(bin_mas1[i],16);
SetLength(mas_bin1,16); 
for i := 0 to len-1 do // вывод отсортированного массива
begin
    StringGrid3.Cells[i,0]:=
mas_bin1 := IntToBin(d[i]);
for j := 0 to 15 do // переписываем отсортированный массив в двоичном виде
bin_mas1[i,j] := mas_bin1[j]; // в mas_bin1 содержится двоичный код каждого элемента отсортированного массива
end; 
Label5.Caption := IntToStr(time2-time1)+ 'ms';
end; 
procedure TForm2.Button4Click(Sender: TObject);
var
bin_num : mas;
i, j,time1,time2: integer;
flag, flag1 : boolean;
s : string;
begin
//Поиск элемента
time1 := GetTickCount;
obr:=StrToInt(Edit2.Text);
Label10.Caption := '';
Label4.Caption := '';
bin_num := IntToBin(obr); // двоичный код искомого числа
s := '';
Memo1.Lines.Clear;
Memo2.Lines.Clear;
    //**************Поиск 
для массива по возрастанию*******************
  {поразрядное 
сравнение двоичных кодов