Автор: Пользователь скрыл имя, 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;
//**************Поиск
для массива по возрастанию*******************
{поразрядное
сравнение двоичных кодов