
- •1 Рекурсия
- •2 Рекурсия и Итерация
- •3 Линейный поиск
- •4 Поиск делением пополам (двоичный поиск)
- •5 Сортировка
- •6 Сортировка простыми включениями.
- •7 Сортировка бинарными включениями
- •8 Сортировка простым выбором.
- •9 Сортировка простым обменом (метод пузырька)
- •10 Шейкер сортировка.
- •11 Сортировка включениями с убывающими приращениями (сортировка Шелла).
- •12 Сортировка с разделением (быстрая сортировка).
- •13 Ссылочные типы.
- •14 Динамические структуры данных
- •15 Создание и уничтожение динамических переменных
- •16. Связанные списки
- •17. Связанные списки. Создание очередного элемента. Просмотр списка
- •18. Добавление компонент в середину списка
- •19. Исключение компонент из середины списка
- •20. Рекурсивная обработка списка
- •Вопрос 21
- •22 Деревья.
- •23 Двоичные деревья.
- •24 Двоичное дерево поиска.
- •25 Добавление узла к двоичному дереву.
- •26 Поиск в двоичном дереве.
- •28 Удаление из дерева.
- •29 Деревья общего вида.
- •30 Становление ооп
- •Абстрагирование
- •Иерархия
- •31 Основные концепции
- •2 Наследование
- •3 Индивидуальность объекта.(Про это у меня вообще ничего нет)
- •32 Абстрактные типы данных
- •37 Виртуальные методы.
- •38 Позднее связывание.
- •39 Полиморфизм
- •40 Расширенная совместимость типов.
- •42 Динамические объекты
- •45 Необходимость виртуальных методов.
12 Сортировка с разделением (быстрая сортировка).
Основана на принципе обмена. Эта сортировка дает лучшие из известных результатов. Алгоритм основан на том факте, что для достижения большей эффективности желательно производить обмены на большие расстояниях. Предположим, что даны т-эл-тов с ключами расположенными в обратном порядке. Их можно рассортировать выполнив всего n/2 обменов если сначала поменять самый левый и самый правый эл-ты и так постепенно приближаться с двух концовк середине. Рассм. алгоритм:
Выберем случайным образом какой-то эл-т (назовем его х). Просмотрим массив двигаясь слева на право, пока не найдем ai>x, а затем рассмотрим его справа на лево пока не найдем aj<x, поменяем местами эти эл-ты. Далее продолжим процесс просмотра с обменом пока два просмотра не встретятся в середине массива. В результате массив разделится на две части – левую с ключами меньше х, и правую с ключами больше х.
var w,x:item begin i:=q; j:=n; {выбор случайного эл-та х} repeat while a[i]<x do i:=i+1; while x<a[j] do i:=j-1; if i<=о then begin w:=a[i]; a[i]:=a[j]; a[j]:=w; i:=i+1; j:=j-1; end; until i>j end;
Если в массиве n одинаковых ключей, то понадобится n/2 обменов. Эти ненужные обмены можно удалить если изменить условие в операторах while
while a[i]<=x do i:=i+1;
while x<=a[j] do j:=j-1;
D этом случаи ч перестанет служить барьером для двух просмотров и предеться придумывать более сложное условие окончания.
Простота условий в приведенной программе оправдывает излишние обмены которые для случайных массивов происходят довольно редко.
Для того, чтобы не только разделить массив, но отсортировать надо сделать тоже самое с обеими полученными частями, затем с частями таких же частей, пока каждая часть не будет содержать только один эл-т.
procedure sort(l,r:index); var I,j:index; x,w:item; begin i:=l; j:=r; x:=a[(l+r) div 2] repeat while a[i]<x do i:=i+1; while x<a[j] do i:=j-1; if i<=о 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 sort(l,j); if i<r then sort(I,r); end begin sort(1,n); end;
В лучшем случаи число сравнений будет порядка n*log n.
Число обменов –порядка n/6*log n
Однако при небольших n ее эффективность не велика и если х выбирается наибольшее значение в массиве то в этом случаи скорость пропорциональна n2
13 Ссылочные типы.
Указатель – это какой-либо адрес в памяти. Это может быть адрес переменной, процедуры или ф-и. Обычно в Паскале нам не надо заботится о том где находятся в памяти. Мы только ссылаемся на эти данные при помощи его имени. Компилятор сам знает где его искать.
var Number:integer
Но можно найти этот адрес используя операнд @.
@Number
Addr(Number)
Можно присвоить этот адрес типа Pointer
var P:Pointer;
Pointer – это нетипизированный указатель, т. е. он не имеет информации о том на какой тип указывает. Чаще удобней определять указатели на определенный тип (записи объекты). Чтобы определить указатели используется знак ^ за которым следует идентификатор типа.
Например определим указатель на тип Integer
Type pinteger=^integer
Var X:Pinteger.
А можно написать сразу
Y:^Integer;
Cтавя ^ этот знак после идентификатора указателем можно получить то данное на которое этот указатель указывает. Например
NumAddress:Pinteger
……………………
Number:=7;
……………………
NumAddress:=@Number
Writeln(Number); {7}
Writeln(NumAddree^);{7}
Эта операция называется разименованием. Переменная типа Pointer не может быть разименованной. Среди всех возможных указателей в ТР выделяется один специальный, который никуда не указывает. Обозначается служебным словом nil. Указатель nil считается константой совместимой с любым ссылочным типом (переменная типа Pointer так же считается совместимой с любым ссылочным типом)
Размиенование считается некорректным если ссылочная переменная имеет значение nil.
Предположим что у нас есть следующие определения
Type указатель = ^ объект
Важно понимать разницу между ссылкой и тем объектом на который она ссылается. Пусть есть P и Q типа указатель ссылающиеся на различные объекты.
Для описания ссылочных типов сделано одно исключение из общих правил – указатель на какой-либо тип может быть описан до объявления самого типа.
Пример
Type PTRMyType = ^ MyType; MyType = record X,y:Real; End;