- •Адресные типы
- •Использование динамической памяти
- •Линейные списки
- •Формы представления линейных списков в оперативной памяти
- •Стеки, очереди, деки
- •Представление стека в непрерывной памяти (в виде массива)
- •Представление стека в связанной памяти (в виде односвязного списка)
- •Очереди
- •Представление очереди в непрерывной памяти (в виде массива)
- •Представление очереди в связанной памяти (в виде односвязного списка)
- •Односвязный список
- •Двусвязный список
- •Кольцевые списки
- •Сортировка с помощью прямого выбора
- •Сортировка с помощью прямого обмена (пузырьковая)
- •Оценка затрат на поиск элемента
Сортировка с помощью прямого выбора
|
i=1 |
6 |
5 |
3 |
4 |
||||
|
|
|
|
|
|||||
|
|
|
|
|
|||||
i=2 |
3 |
5 |
6 |
4 |
|||||
|
|
|
|
|
|||||
|
|
|
|
|
|||||
i=3 |
3 |
4 |
6 |
5 |
|||||
|
|
|
|
|
|||||
|
|
|
|
|
|||||
Рез-т |
3 |
4 |
5 |
6 |
|||||
Procedure StraigthSelection; Var I, j, k:Integer; min:Integer; begin for i:=1 to n-1 do begin k:=i; min:=a[i]; for j:=i to n do if a[j]<min then begin k:=j; min:=a[k]; end; a[k]:=a[i]; a[i]:=min; end; end; |
Procedure StraigthSelection(H:List); Var p1,p2,pMin:List; min:Integer; begin if H<>nil then begin p1:=H; repeat pMin:=p1; {ссылка на узел с мин. значением} min:=p1^.info; p2:=p1^.next; {Поиск наименьшего значения в оставшейся части списка} While p2<>H do begin if p2^.info<min then begin min:=p2^.info; pMin:=p2; end; p2:=p2^.next; end; {Обмен} pMin^.info:=p1^.info; p1^.info:=min; {Переход на следующий узел} p1:=p1^.next; until p1^.next=H; end; end; |
Сортировка с помощью прямого обмена (пузырьковая)
Алгоритм прямого обмена основан на сравнении и, при необходимости, обмене значений в паре соседних элементов и продолжении этого процесса до тех пор, пока не будут упорядочены все элементы: повторяем проходы по массиву (списку), сдвигая каждый раз наибольший (или наименьший) элемент в оставшейся последовательности к его правому концу. При каждом проходе элемент перемещается до уровня, соответствующего его значению.
ПРОЦЕДУРА СОРТИРОВКИ МАССИВА (ПО ВОЗРАСТАНИЮ)
PROCEDURE BubbleSort;
VAR
i, j:Integer;
x:Integer;
BEGIN
FOR i := N Downto 2 do
FOR j:=1 to i-1 do
IF a[j] > a[j+1] THEN
BEGIN
x := a[j]; a[j] := a[j+1]; a[j+1]:=x
END
END {BubbleSort};
i=N (4)
6
5
3
4
5
6
3
4
5
3
6
4
5
3
4
6
i=N-1 (3)
5
3
4
6
3
5
4
6
3
4
5
6
i=N-2 (2)
3
4
5
6
СОРТИРОВКА СОДЕРЖИМОГО КОЛЬЦЕВОГО СПИСКА (ОДНОСВЯЗНОГО/ДВУСВЯЗНОГО)
-
Функция для подсчета числа узлов в кольцевом списке (вспомогательная)
Function NodesCount(var H:List):Integer;
Var
p:List;
i:integer;
begin
if H=nil then i:=0
else
Begin
p:=h;
i:=1;
while p^.next<>h do
begin
p:=p^.next;
inc(i);
end;
End;
NodesCount:=i;
End;
procedure BubbleSort(h:list);
var
i, j, n: integer;
p1:list;
x:integer;
begin
n:=nodescount(h);
for i := n downto 2 do
begin
p1:=h;
for j:=1 to i-1 do
begin
if p1^.info>p1^.next^.info then
begin
x := p1^.info;
p1^.info := p1^.next^.info;
p1^.next^.info:= x;
end;
p1:=p1^.next;
end;
end;
end {Bubblesort};
