
- •Тема 3б. Улучшенные методы сортировки массивов
- •Из предыдущей лекции мы знаем, что
- •Улучшенные методы сортировки эффективность О(n log2n)
- •Идея метода Шелла
- •Идея пирамидальной сортировки
- •Сортировка с помощью дерева поиска
- •Сортировка слиянием
- •Напомним, что тип массива записей введен следующим образом
- •Процедура слияния двух отсортированных
- •Трассировка слияния
- •Рекурсивное разбиение на подзадачи
- •Рекурсивная процедура сортировки слиянием
- •Описание класса
- •Трассировка сортировки слиянием
- •Метод разделения Хоара
- •Процедура разделения
- •Трассировка разделения
- •Рекурсивное разделение на подзадачи
- •Трассировка
- •Нерекурсивный вариант (начало)
- •Нерекурсивный вариант (продолжение)
- •Рекомендации
- •Контрольные вопросы
- •Задачи на экзамен
- ••unit Unit2;
- ••implementation
- ••Procedure Tob.SortSlip;
- ••Procedure SrSL(L,R:word);
- ••procedure TForm1.Button1Click(Sender: TObject);
- •Обработка события «Изменение окна Edit3»
- •Пример оформления экзаменационной задачи
- •Задачи на экзамен
- ••unit Unit2;
- ••implementation
- ••Procedure Tob.QuickSort;
- ••unit Unit1;
- •Обработка события «Изменение окна Edit3»
- •Пример оформления экзаменационной задачи
- •Конец темы 3
•procedure TForm1.Button1Click(Sender: TObject);
•Var n0,i:word;
•// a:mas;
•Ob: Tob;
•begin
•n0:=strtoint(Edit3.text);
•Ob:=Tob.Create(n0);
•for i:=1 to ob.n do begin
•ob.a[i].k:=strtoint(StringGrid1.Cells[i,0]);
•ob.a[i].zp:=StringGrid1.Cells[i,1];
• |
end; |
•ob.SortSlip;
•for i:=1 to ob.n do begin
•StringGrid2.Cells[i,0]:=inttostr(ob.a[i].k);
•StringGrid2.Cells[i,1]:=ob.a[i].zp;
• |
end; |
•ob.Free;
•end;
07/02/19 |
32 |
Обработка события «Изменение окна Edit3»
•procedure TForm1.Edit3Change(Sender: TObject);
•begin
•StringGrid1.Cells[0,0]:='key';
•StringGrid1.Cells[0,1]:='fio';
•StringGrid2.Cells[0,0]:='key';
•StringGrid2.Cells[0,1]:='fio';
•StringGrid1.ColCount :=strtoint(Edit3.text)+1;
•StringGrid2.ColCount :=strtoint(Edit3.text)+1;
•end;
•end.
07/02/19 |
33 |

Пример оформления экзаменационной задачи
07/02/19 |
34 |
Задачи на экзамен
Ввести массив записей {a[i].f, a[i].k} (f -
фамилия; к - учетный номер) из TstringGrid1, отсортировать по ключу к и выдать в TStringGrid2.
Алгоритм сортировки по методу разделения Хоара в виде рекурсивной процедуры оформить в отдельный модуль Unit2 как метод класса.
07/02/19 |
35 |
•unit Unit2;
•interface
•Type
•Tinf=string[4];
•Tkey=word;
•Tzp=record
• |
zp:Tinf; |
• |
k:Tkey; |
• |
end; |
•mas=array[1..1] of Tzp;
•Tmas=^mas;
Класс
сортировки
разделением
•Tob=class
•a:Tmas;
•n:word;
•constructor create(n0:word);
•Procedure QuickSort;
•destructor Free;
• |
end;07/02/19 |
36 |
•implementation
•constructor Tob.create(n0:word);
•begin
•inherited create;
•n:=n0;
•getmem(a,n0*sizeof(Tzp));
•end;
•destructor Tob.Free;
•begin
•Freemem(a,n*sizeof(Tzp));
•end;
07/02/19 |
37 |
•Procedure Tob.QuickSort;
•Procedure rdiv(L,R: word);
• |
Var i,j:Word; w:Tzp; x:Tkey; |
•begin
• |
i:=L; j:=R; |
|
• |
x:=a[(L+R) div |
2].k; |
• |
Repeat |
|
• |
While a[i].k<x do |
i:=i+1; |
• |
While a[j].k>x do |
j:=j-1; |
• |
if i<=j then begin |
|
•w:=a[i];a[i]:=a[j];a[j]:=w;i:=i+1;j:=j-1;
• |
|
|
end; |
• |
until |
i>j; |
|
• |
if |
L<j |
then rdiv(L,j); |
• |
if |
i<R |
then rdiv(i,R); |
•end; //rdiv
•begin
•rdiv(1,n);
•end;
• end. |
07/02/19 |
38 |
|
•unit Unit1;
•implementation
•uses unit2;
•procedure TForm1.Button1Click(Sender: TObject);
•Var n0,i:word; Ob: Tob;
•begin
•n0:=strtoint(Edit3.text);
•Ob:=Tob.Create(n0);
•StringGrid1.Cells[0,0]:='key';
•StringGrid1.Cells[0,1]:='fio';
•for i:=1 to ob.n do begin
•ob.a[i].k:=strtoint(StringGrid1.Cells[i,0]);
•ob.a[i].zp:=StringGrid1.Cells[i,1];
• |
end; |
•ob.QuickSort;
•for i:=1 to ob.n do begin
•StringGrid2.Cells[i,0]:=inttostr(ob.a[i].k);
•StringGrid2.Cells[i,1]:=ob.a[i].zp;
• |
|
end; |
• |
ob.Free; |
|
• |
end; 07/02/19 |
39 |
Обработка события «Изменение окна Edit3»
•procedure TForm1.Edit3Change(Sender: TObject);
•begin
•StringGrid1.Cells[0,0]:='key';
•StringGrid1.Cells[0,1]:='fio';
•StringGrid2.Cells[0,0]:='key';
•StringGrid2.Cells[0,1]:='fio';
•StringGrid1.ColCount :=strtoint(Edit3.text)+1;
•StringGrid2.ColCount :=strtoint(Edit3.text)+1;
•end;
•end.
07/02/19 |
40 |

Пример оформления экзаменационной задачи
07/02/19 |
41 |