
- •Тема 5.
- •Поиск адреса элемента, который содержит заданный ключ K в информационном поле Inf.key
- •Обращение
- •Поиск адреса элемента списка с меткой, после
- •Обращение
- •Два метода пузырьковой сортировки
- •Перестановка элементов с помощью обмена информации
- •Перестановка элементов с помощью обмена ключами
- •сортировка стека пересылкой информации
- •Иллюстрация сортировки стека
- •сортировка стека с меткой
- •Иллюстрация сортировки стека
- •Рекурсивное соотношение при сортировке очереди слиянием
- •Сортировка очереди слиянием
- •Слияние двух отсортированных очередей в одну отсортированную (Slip)
- •Procedure Slip
- •Разбиение одной очереди на две очереди
- •Procedure Div2sp
- •Пример класса
- •Чтение из StringGrid в список
- •Вывод списка в StringGrid
- •Пример формы
- •Управляющие кнопки
- •Управляющие кнопки
- •Управляющие кнопки
- •Выводы
- •Контрольные вопросы
- •Задачи на экзамен
Тема 5.
АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ НА СВЯЗАНЫХ ЛИНЕЙНЫХ СПИСКАХ
Поиск в однонаправленных списках
Поиск заданного элемента
Поиск элемента после заданного
Сортировка однонаправленных
списков
Пузырьковая сортировка
Сортировка слиянием
07/02/19 |
1 |
|
Класс для работы со списком |
• |
Type Tlist=class(Tobject) |
• |
sp1,spk,sp:Tsel; |
• |
constructor create; |
• |
procedure Add1(Inf:Tinf); |
• |
procedure Addk(Inf:Tinf); |
• |
procedure Read1(Inf:Tinf); |
• |
Function Tlist.Poisk(K:TKey):Tsel; |
•. . . . . . . . . . . . .
• |
procedure Print; |
•end;
• |
constructor Tlist.create; |
|
• |
begin |
|
• |
inherited create; |
|
• |
sp1:=nil; spk:=nil; |
|
• |
end; |
|
Будем добавлять в этот класс новые методы |
|
|
|
07/02/19 |
2 |

Поиск адреса элемента, который содержит заданный ключ K в информационном поле Inf.key
•Function Tlist.Poisk(K:TKey):Tsel;
• |
begin |
|
|
|
|
|
|
• |
if sp1=Nil then Resalt:=Nil else |
|
|
||||
• |
|
begin//если список не пуст |
|
|
|||
• |
|
sp:=sp1; |
|
|
|
|
|
• |
|
While(sp^.Inf.key<>K) and (sp^.A<>Nil) |
|
||||
• |
|
|
|
|
do sp:=sp^.A; |
|
|
• |
|
if sp^.Inf.key<>K then |
Result:=Nil |
|
|||
• |
|
|
|
else |
Result:=sp |
|
|
• |
end; end; |
|
|
|
|
|
|
sp1 |
|
|
|
|
spk |
|
|
|
|
|
|
|
|
|
|
I1 |
A1 |
I.key=k A2 |
…. |
Ik-1 |
Ak-1 |
Ik |
nil |
|
07/02/19 |
sp |
|
|
|
3 |
|
|
|
|
|
|
Обращение
• Var List:Tlist; sp:Tsel;
• inf:Tinf; Kl:Tkey;
•begin
•List:=Tlist.Create;
•. . . . .
•sp:=List.poisk(kl);
•If sp<>nil then Write(sp.inf);
•. . . .
•List.Free;
07/02/19 |
4 |

Поиск адреса элемента списка с меткой, после
которого находится элемент, содержащий заданный ключ K в информационном поле Inf.key
•Function Tlist.PoiskAfter(k:Tkey):Tsel;
• |
begin |
• |
if sp1^.A=Nil then Resalt:=Nil else |
• |
begin//если элементов больше чем один |
• |
sp:=sp1; |
•While(sp^.A^.Inf.key<>k) and (sp^.A^.A<>Nil)
• |
do sp:=sp^.A; |
•if sp^.A^.Inf.key<>k then Result:=Nil
• |
|
|
|
|
|
|
|
else Result:=sp; |
|
|
|
||||||||||||
• |
|
|
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||||
• |
end; |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
||||
sp1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
…. |
|
|
|
|
|
|
|
spk |
|
|
|
||||
|
|
|
Метка |
A |
|
|
|
I1 |
A1 |
|
|
|
|
Ik-1 |
Ak-1 |
|
|
|
I.key=k |
nil |
|
||
|
|
|
|
|
|
|
|
|
|
||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
07/02/19 |
|
|
|
|
|
|
|
|
sp |
|
5 |
Обращение
•Var List:Tlist; sp:Tsel;
•inf:Tinf; Kl:Tkey;
•begin
•List:=Tlist.Create;
•. . . . .
•sp:=List.poiskAfter(kl);
•If sp<>nil then Write(sp.A.inf);
•. . . .
•List.Free;
•Эффективность O(n),
•т.е. Коп<=C*n при n , C – не зависит от n
07/02/19 |
6 |
Два метода пузырьковой сортировки
При выводе данных полезно список упорядочить (отсортировать) по ключу.
Метод пузырьковой сортировки основан на последовательной перестановке местами двух соседних элементов.
Поменять местами два соседних элемента в однонаправленном списке можно двумя способами:
С помощью обмена информации
С помощью обмена адресами
07/02/19 |
7 |

Перестановка элементов с помощью обмена информации
•Procedure RevInf(sp:Tsel);
•Var Inf:TInf;
• begin
•Inf:=sp^.Inf;
•sp^.Inf:=sp^.A^.Inf;
•sp^.A^.inf:=Inf;
• end;
|
|
|
|
|
|
|
|
|
|
|
|
Inf |
|
|
|
|
|
|
|
|
|||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|||||
sp1 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
spk |
|
|
|||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
… |
|
|
|
|
Ik |
Ak |
|
|
|
Ik-1 |
Ak-1 |
|
…. |
|
|
|
Ik |
nil |
||
|
|
|
|
|
|
|
|
||||||||||||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
07/02/19 |
|
sp |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
8 |
||||||
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|

Перестановка элементов с помощью обмена ключами
•Procedure RevAfter(spi:Tsel);
•Var sp:Tsel;
• |
begin |
|
|
|
|
• |
sp:=spi^.A^.A; |
// 1) |
|
||
• |
spi^.A^.A:=sp^.A; // 2) |
|
|||
• |
sp^.A:=spi^.A; |
// 3) |
|
||
• |
spi^.A:=sp; |
// 4) |
|
||
• |
end; |
|
|
|
|
|
spi |
|
3 |
|
|
|
|
|
2 |
|
|
|
|
|
|
|
|
|
Inf A |
|
Inf A |
Inf A |
Inf A |
|
|
|
1 |
|
|
|
|
4 |
sp |
|
|
|
|
|
|
|
07/02/19 |
9 |
сортировка стека пересылкой информации
•Procedure Tlist.SortBublInf;
•Procedure RevInf(spi:Tsel);
• |
Begin . . . end; |
•Var spt:Tsel;
•begin
•spt:=Nil;
•Repeat
• |
sp:=sp1; |
• |
While sp^.A<>spt do begin |
•if sp^.Inf.key>sp^.A^.Inf.key then RevInf(sp);
• |
sp:=sp^.A; |
• |
end; |
• |
spt:=sp;//запомнили последний |
•Until sp1^.A=spt;
•end;
07/02/19 |
10 |