Автор: Пользователь скрыл имя, 17 Февраля 2012 в 16:31, курсовая работа
Цель моей работы: оценить эффективность методов сортировки обменами, вставка-ми, метода Хоара и метода Уильмса-Флойда.
Для достижения поставленной цели необходимо решить следующие задачи:
1) Изучить алгоритмы сортировки обменами, сортировки вставками(Пузырьком), сортировки методом Хоара(Быстрая) и метода Уильямса-Флойда(Пирамидальная).
2) Реализовать и наглядно продемонстрировать эти методы в следующей задаче:
1. Сгенерировать N пар точек (x1, y1) и (x2, y2) случайным образом.
2. Вычислить площади прямоугольников, построенных по этим парам точек. Прону-меровать эти прямоугольники.
3. Отсортировать эти прямоугольники по возрастанию площади. Использовать сорти-ровку обменами, вставками, метод Хоара, метод Уильямса-Флойда.
4. Оценить эффективность этих методов для большого количества элементов, изме-рив время работы.
5. *Построить прямоугольники, закрашенные разным цветом.
Введение ………...…………...…………………………………………………..………………3
Глава 1. Алгоритмы сортировок
1.1 Сортировка методом обмена.……………………………………………..…………… 5
1.2 Сортировка с помощью выбора…………………………………………………………6
1.3 Сортировка методом Хоара ………………………………………...…………………. 7
1.4 Сортировка методом Уильямса-Флойда……...………………………………………..9
Глава 2. Эффективность методов
2.1 Сравнение методов сортировки………………………………………………………..12
2.2 Применение методов……………………………………………………………………14
Глава 3. Графический интерфейс
3.1 Стартовое окно………………………………………………………………………… 15
3.2 Построение неотсортированных прямоугольников.………………..………………… 15
3.3 Сортировка отсортированных прямоугольников…………………………………… 16
Заключение …………………....………………………………………………………………. 17
Библиографический список …………………………………………………...………….….. 18
Приложения…...………………………………………………………………………………...
mas=array[0..416600] of
longint;
//$VCLDESIGN+
var
Form1: Form;
TextLabel1: TextLabel;
PaintBox1: PaintBox;
Edit1: Edit;
Button1: Button;
RadioButton1: RadioButton;
RadioButton2: RadioButton;
RadioButton3: RadioButton;
RadioButton4: RadioButton;
Button2: Button;
Button3: Button;
Panel1: Panel;
//$VCLDESIGN-
X1, X2, Y1, Y2, S, A: mas;
N, i, j, dat: integer;
ts: string;
procedure InitControls;
begin
Form1:= Form.Create(0,0,877,368);
Form1.InitControl(True,False,
TextLabel1:= TextLabel.Create(Form1,8,8,
TextLabel1.InitControl(True,
PaintBox1:= PaintBox.Create(Form1,368,16,
PaintBox1.InitControl(True,
Edit1:= Edit.Create(Form1,168,8,65,17)
Edit1.InitControl(True,True,
Button1:= Button.Create(Form1,248,5,75,
Button1.InitControl(True,True,
RadioButton1:= RadioButton.Create(Form1,8,32,
RadioButton1.InitControl(True,
RadioButton1.PopMenu:= nil;
RadioButton2:= RadioButton.Create(Form1,8,48,
RadioButton2.InitControl(True,
RadioButton2.PopMenu:= nil;
RadioButton3:= RadioButton.Create(Form1,8,64,
RadioButton3.InitControl(True,
RadioButton3.PopMenu:= nil;
RadioButton4:= RadioButton.Create(Form1,8,80,
RadioButton4.InitControl(True,
RadioButton4.PopMenu:= nil;
Button2:= Button.Create(Form1,8,104,153,
Button2.InitControl(True,True,
Button3:= Button.Create(Form1,168,104,
Button3.InitControl(True,True,
Panel1:= Panel.Create(Form1,8,192,73,
Panel1.InitControl(True,True,
RadioButton1.Checked:= True;
Form1.Position:= poScreenCenter;
Form1.Show;
end;
procedure Rand;
begin
for i:=1 to N do
begin
X1[i]:= random(480);
X2[i]:= random(480);
Y1[i]:= random(290);
Y2[i]:= random(290);
end;
end;
procedure Space;
begin
for i:=1 to N do
begin
S[i]:=abs((X1[i]-X2[i])*(Y1[i]
end;
end;
procedure ExchangeSort( var A : mas );
var
x : integer;
begin
for i := N downto 2 do
for j := 2 to i do
if A[j] < A[j - 1] then
begin
x := A[j];
A[j] := A[j - 1];
A[j - 1] := x;
end;
end;
procedure InsertSort( var A : mas );
var
i, k : Integer;
x : integer;
begin
{ Вставляем в уже отсортированную часть элементы со 2 по max }
for i := 2 to N do
begin
k := i;
x := A[i];
{ Передвигаем на 1 позицию направо элементы,
большие вставляемого элемента (он записан в x) }
while (A[k - 1] > x) do
begin
A[k] := A[k - 1];
k := k - 1;
end;
{ Вставляем элемент в нужную позицию }
A[k] := x;
end;
end;
Procedure PiramidaSort(var A: mas);
Var t, k, i, Y: Integer;
Begin
For i := 2 to N do { создание структуры бинарного дерева-"пирамиды" }
begin
t := i;
while t <> 1 do
begin k := t div 2;
If A[k] >= A[t] then t := 1
else
begin
Y:=A[k]; A[k]:=A[t]; A[t]:=Y;
t := k;
end
end
end;
For i := N-1 downto 1 do { сортировка массива-"пирамиды" }
begin
Y:=A[i+1]; A[i+1]:=A[1]; A[1]:=Y;
t := 1;
While t <> 0 do
begin
k := t+t;
If k > i then t := 0
else
begin
If k < i then If A[k+1] > A[k] then k := k+1;
If A[t] >= A[k] then t := 0
else
begin
Y:=A[k]; A[k]:=A[t]; A[t]:=Y;
t := k
end;
end;
end;
end;
End;
{ Процедура разбиения массива для быстрой сортировки }
function Partition( var A : mas; l, r : Integer; x : integer ) : Integer;
{ Переставляем элементы массива так, чтобы слева от элемента,
равного x, были только элементы меньшие или равные x,
а справа - элементы, большие или равные x }
var
i, j : Integer;
t : integer;
begin
i := l - 1;
j := r + 1;
repeat
{ Пока элементы справа больше среднего }
repeat
j := j - 1;
until x >= A[j];
{ Пока элементы слева меньше среднего }
repeat
i := i + 1;
until A[i] >= x;
{ Меняем левый и правый элементы и продолжаем дальше }
if i < j then
begin
t := A[i];
A[i] := A[j];
A[j] := t;
end;
{ Иначе - левый и правый встретились -
разбиение
массива завершено }
until i >= j;
Partition := j;
end;
{ Рекурсивная процедура быстрой сортировки }
procedure RecoursiveQuick( var A : mas; l, r : Integer );
var
m : Integer;
begin
if l < r then
begin
{ В качестве
граничного элемента
элемент массива }
m := Partition(A, l, r, A[(l + r) div 2]);
RecoursiveQuick(A, l, m);
RecoursiveQuick(A, m + 1, r);
end;
end;
{ Быстрая сортировка }
procedure QuickSort( var A : mas );
begin
RecoursiveQuick(A, 1, N);
end;
procedure Generation;
begin
val(edit1.text, N, i);
rand;
Space;
for i:=1 to N do
A[i]:=S[i];
end;
procedure Exchange;
begin
for i:=1 to N do
A[i]:=S[i];
dat:=currentdatetime.
ExchangeSort(A);
dat:=currentdatetime.
str(dat,ts);
panel1.caption:=ts+'мc';
end;
procedure Insert;
begin
for i:=1 to N do
A[i]:=S[i];
dat:=currentdatetime.
InsertSort(A);
dat:=currentdatetime.
str(dat,ts);
panel1.caption:=ts+'мc';
end;
procedure Piramida;
begin
for i:=1 to N do
A[i]:=S[i];
dat:=currentdatetime.
PiramidaSort(A);
dat:=currentdatetime.
str(dat,ts);
panel1.caption:=ts+'мc';
end;
procedure Quick;
begin
for i:=1 to N do
A[i]:=S[i];
dat:=currentdatetime.
QuickSort(A);
dat:=currentdatetime.
str(dat,ts);
panel1.caption:=ts+'мc';
end;
procedure Sort;
begin
if radiobutton1.checked=true then Exchange;
if radiobutton2.checked=true then Insert;
if radiobutton3.checked=true then Quick;
if radiobutton4.checked=true then Piramida;
end;
procedure Build;
begin
for j:=N downto 1 do
for i:=N downto 1 do
if A[j]= S[i] then
begin
paintbox1.rectangle(X1[i],Y1[
paintbox1.floodfill((X1[i]+X2[
end;
end;
begin
InitControls;
button1.onclick:= Generation;
button2.onclick:= Sort;
button3.onclick:= Build;
end.
Приложение 2. Вспомогательная
программа
uses utils;
const R= 50000;
type
mas=array[0..416600] of longint;
var A:mas;
i, j, k : integer;
N, dat: longint;
procedure Rand;
begin
for i:=1 to N do
A[i]:=random(R);
end;
procedure ExchangeSort;
var