
- •Тема 3a. Поиск и сортировка
- •Зачем нужны сортировка и поиск
- •Зачем нужны сортировка и поиск
- •Организация работы с базами данных
- •Для определенности в дальнейшем тип массива записей введем следующим образом
- •Ключ записи, требования к нему
- •Наиболее частыми операциями при работе с базами данных являются «поиск» и «сортировка» записей
- •Поиск в массиве записей
- •Линейный поиск
- •Эффективность Линейного поиска
- •Поиск с барьером
- •Основная идея алгоритма поиска делением пополам в упорядоченном массиве
- •Алгоритм поиска делением пополам
- •Особенность
- •Рекурсивная реализация двоичного поиска
- •Трассировка алгоритма
- •Трассировка алгоритма
- •Эффективность двоичного поиска
- •Сортировка массивов
- •Методы внутренней сортировки массивов характеризуются тем, что все перестановки элементов должны выполняться «на
- •Эффективность сортировки
- •Прямые методы коротки, просто программируются
- •Прямые методы внутренней сортировки можно разбить на три категории
- •Метод прямого обмена
- •Программа метода прямого обмена
- •Трассировка метода пузырька
- •Метод прямого включения
- •Программа метода прямого включения
- •Трассировка метода прямого включения
- •Метод прямого выбора
- •Программа Метода прямого выбора
- •Трассировка метода прямого выбора
- •Двоичный поиск с объектом
- •Двоичный поиск с объектом1
- •Двоичный поиск с объектом3
- •Двоичный поиск с объектом1
- •Контрольные вопросы
- •Задачи на экзамен
- •Задачи на экзамен
- •Конец темы 3
Программа Метода прямого выбора
•for i=1 to n-1 do
•begin
•m:=i; //поиск m
•for j=i+1 to n do
• |
if a[j].k<a[m].k then m:=j; |
|
• |
r:=a[i]; //перестановка |
|
• |
a[i]:=a[m]; |
|
• |
a[m]:=r; |
|
• |
end; |
|
|
07/02/19 |
31 |
Трассировка метода прямого выбора
• |
8 |
6 2 5 1 |
i=1 |
• |
1 |
6 2 5 8 |
i=2 |
• |
1 |
2 6 5 8 |
i=3 |
• |
1 |
2 5 6 8 |
i=4 |
• |
1 |
2 5 6 8 |
i=5 |
•1 2 5 6 8
07/02/19 |
32 |
Двоичный поиск с объектом
•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);
•Function PoiskD(x:Tkey): word;
•destructor Free;
• |
07/02/19 |
33 |
end; |
|
Двоичный поиск с объектом1
•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 |
34 |
|
Двоичный поиск с объектом2 |
• |
Function Tob.PoiskD(x:Tk): word; |
• |
Function Del(L,R:word):word; |
• |
var m:word; |
• |
begin |
• |
if R<=L then Del:=R |
• |
else begin |
• |
m:=(L+R)div 2; |
• |
if a[m].k<x then Del:=Del(m+1,R) |
• |
else Del:=Del(L,m); |
• |
end; |
• |
end; // Del |
•var i:word;
•begin
•i:=Del(1,n);
•if a[i].k=x then Result:=i
• |
else Result:=0; |
|
• |
end; //Poisk |
|
• |
end. //unit1 |
35 |
|
07/02/19 |
Двоичный поиск с объектом3
•unit Unit1;
•Interface
•. . .
•implementation
•uses unit2;
•. . .
•procedure TForm1.Edit3Change(Sender: TObject);
•begin
•StringGrid1.ColCount :=strtoint(Edit3.text)+1;
•end;
07/02/19 |
36 |
• |
procedure TForm1.Button1Click(Sender: TObject); |
||
• |
Var n0,i,x,k:word; |
Работа с объектом |
|
• |
Ob: Tob; |
||
«Поиск двоичный» |
|||
• |
Begin |
•StringGrid1.Cells[0,0]:='key';
•StringGrid1.Cells[0,1]:='fio';
•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; |
•x:=strtoint(edit1.text);
•k:=ob.PoiskD(x);
•if k=0 then Edit2.Text:='not element'
• |
else Edit2.Text:=ob.a[k].zp; |
•ob.Free;
•end;
•end; //unit1
07/02/19 |
37 |

Двоичный поиск с объектом1
07/02/19 |
38 |
Контрольные вопросы
Что такое ключ записи и основное требование к нему?
Опишите алгоритм линейного поиска с барьером. Какова его эффективность?
Опишите алгоритм двоичного поиска и дайте оценку его эффективности.
Изложите алгоритмическую идею трех основных методов прямой сортировки массива и охарактеризуйте их эффективность.
07/02/19 |
39 |
Задачи на экзамен
В упорядоченном по ключу массиве записей {a[i].f, a[i].k} (f – фамилия; к - учетный номер) найти и выдать в окошко TEdit информацию из ячейки, содержащей заданный ключ х.
Алгоритм двоичного поиска в виде
рекурсивной функции оформить в отдельном модуле Unit2 как метод класса.
Ввод исходного массива записей организовать из TStringGrid.
07/02/19 |
40 |