Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лекция ФилП.docx
Скачиваний:
13
Добавлен:
19.09.2019
Размер:
401.58 Кб
Скачать

Алгоритмы сортировки

1 Пузырьковая сортировка

bubble(Src,Res) :-

exchange(Src,Tmp),!,

bubble(Tmp,Res).

bubble(Src,Src).

exchange([X,Y|Rest],[Y,X|Rest]) :- X>Y.

exchange([H|L1],[H|L2]):-exchange(L1,L2).

Если в списке есть 2 соседних элемента нарушающих заданный порядок, то переставляем эти элементы и продолжаем сортировку, иначе завершаем сортировку поскольку список получился упорядоченным.

Иначе – значит рассмотренные нами случае альтернативны…отсечение…

1 входной список Src, 2 аргумент – Res – результат.

Предикат Exchange – поменять местами.

Если можно поменять местами то получим новый вмененный список tmp, далее безальтернативно используя отсечение будем сортир полученный список tmp, чтобы получить результат Res, этот рез –т базовый случай…второе правило…оно будет выполняться только когда exchange потерпит неудачу и тогда исходный список будет результирующим списком, происходит выдача результата.

Рассмотрим предикат Exchange(поменять местами).

1 случай – если в исх списке 2 первых элемента X и Y такие что X>Y, то нарушение обнаружено в начале списка то результатом будет список Y, X и далее неизмененный хвост. Иначе второй случай. Мы строим список первая голова которого остается на месте, а хвост получается перестановкой в хвосте, соответ. первой голове.

…..После условия нужно поставить отсечение….. иначе будет действовать 2 правило, голова H и хвост L1.

Сортировка вставками

insSort([X|Xs],Ys) :- insSort(Xs,Zs), insert(X,Zs,Ys). insSort([],[]). insert(X,[],[X]). insert(X,[Y|Ys],[Y|Zs]) :- X > Y, insert(X,Ys,Zs). insert(X,[Y|Ys],[X,Y|Ys]) :- X =< Y.

Идея. Отсортированный список – это отсортированный хвост исх. списка, в который вставлена его голова так, чтобы не нарушился порядок сортировки.

1 исх список, 2 – результир.список.

Если список имеет голову X и хвост Xs то нужно отсорт хвост Xs, получается список Zs далее нужно вставить Xs спец функцией в …. И получ. результат.

В базовом случае, когда исх список пуст – то результат пустой список.

Insert – вставка в отсорт. список не нарушая порядка сортировки.

В общем случае у нас задан элемент X список Y Ys получаем список Y Zs если X>Y. Нужно двигаться в глубь списка… Если X<=Y то мы можем этот элемент сразу вставить.

Базовый случай, когда список пуст, то результатом будет список, содерж. один элемент X.

Процедуру Insert можно реализовать с отсечением.

Быстрая сортировка.

quicksort([X|Xs],Ys) :- partition(Xs,X,Littles,Bigs), quicksort(Littles,Ls), quicksort(Bigs,Bs), append(Ls,[X|Bs],Ys). quicksort([],[]). partition([X|Xs],Y,[X|Ls],Bs) :- X < Y, partition(Xs,Y,Ls,Bs). partition([X|Xs],Y,Ls,[X|Bs]) :- X >= Y, partition(Xs,Y,Ls,Bs). partition([],Y,[],[]).

Были n2. Эта быстрее.

Список каждый раз делится пополам, сорт его половинки и за счет этого повышается эффективность. Метод разделяй и властвуй.

Log2

Идея. Для того чтобы отсортировать список L нужно взять его голову, хвост разделить на 2 списка. В первом списке будут элементы меньшей головы, во втором большей или равные. Далее оба списка сортируем. Результат получается сцеплением двух списков. Первый из них – это отсортированный список меньшиъ элементов, а второй список имеет голову как у исходного списка, а хвост отсортированный список бОльших элементов.

quicksort([X|Xs],Ys) 1 - исх список, 2 – результирующий.

partition(Xs,X,Littles,Bigs), - разбиение, поделим хвост Xs с головой … на 2 списка Littles b Bigs.

quicksort(Littles,Ls), quicksort(Bigs,Bs),

далее сцепление 2х списков append(Ls,[X|Bs],Ys). Берутся меньшие элементы ,к ним большие, получаем Ys – рез-т работы всей процедуры.

Если список пустой – то тоже пустой список.

Имеем 2 выходных параметра -3 и 4,меньшие и большие.

partition([X|Xs],Y,[X|Ls],Bs) :- X < Y, partition(Xs,Y,Ls,Bs).

partition([X|Xs],Y,Ls,[X|Bs]) :- X >= Y, partition(Xs,Y,Ls,Bs).

partition([],Y,[],[]). Базовый случай, разделение пустого списка – 2 пустых списка. Эту процедуру можно сделать с отсечением!