Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Основы программирования на языке Turbo Prolog.doc
Скачиваний:
56
Добавлен:
09.11.2019
Размер:
563.2 Кб
Скачать

2. Сортировка списков методом вставки

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

Существует много способов сортировки списков. Сортирующее правило Турбо-Пролога принимает на вход неотсортированный список, и выдает отсортированный на выходе. Входной список называется ИСХОДНЫМ, выходной — ЦЕЛЕВЫМ.

Метод вставки особенно удобен для реализации его на Турбо-Прологе.

Идея этой сортировки следующая:

1. Извлекаем из списка голову H.

2. Методом вставки сортируем хвост.

3. Вносим H в подходящее место отсортированного хвоста.

Опишем предикат, производящий сортировку списка методом вставки

insert_sort(Source_list,Target_list)

Внешней целью в задаче сортировки списка [4,7,3,9] будет утверждение

insert_sort([4,7,3,9],S)

В этом утверждении отсортированный список обозначен переменной S. Правила, реализующие этот способ сортировки, имеют следующую структуру:

insert_sort([],[]).

insert_sort([H|T],Sorted_list) :-

insert_sort(T,Sorted_Tail),

insert(H,Sorted_Tail,Sorted_list).

insert(X,[H|Sorted_list],[H|Sorted_list1]) :-

X > H,!,

insert(X,Sorted_list,Sorted_list1).

insert(X,Sorted_list,[X|Sorted_list]).

Дальнейшее обсуждение продемонстрирует работу правил на примере списка [4,7,3,9].

Вначале Турбо-Пролог применяет приведенные правила к исходному списку, выходной список в этот момент еше не определен.

insert_sort([4,7,3,9],_)

Первая попытка удовлетворить правило insert_sort осуществляется с первым вариантом правила

insert_sort([],[])

Для удовлетворения правила оба списка должны быть пустыми.

Согласно второму варианту правила внутренние унификационные процедуры Турбо-Пролога пытаются сделать пустым исходный список. Рекурсия убирает элементы исходного списка, начиная с головы, и переносит их в стек. В результате применения этой процедуры список становится нулевым. Теперь первый вариант правила insert_sort производит обнуление выходного списка.

Далее, первое взятое из стека значение (9), вносится во второй список:

insert(9,[],[9])

Из стека извлекается следующий элемент (3), и при помощи второго варианта insert вставляется в выходной список слева от 9:

insert(3,[9],[3,9])

Происходит возврат к insert_sort, теперь оно имеет форму

insert_sort([3,9],[3,9])

Таким образом, все элементы извлекаются из стека и помещаются в выходной список.

/* Программа 7.2. Назначение: */

/* демонстрация сортировки списка */

/* в порядке возрастания методом вставки */

domains

list = integer *

predicates

insert_sort(list,list)

insert(integer,list,list)

clauses

insert_sort([],[]).

insert_sort([H|T,Sorted_list) :-

insert_sort(T,Sorted_Tail),

insert(H,Sorted_Tail,Sorted_list).

insert(X,[H|Sorted_list],[H|Sorted_list1]) :-

X > H, !,

insert(X,Sorted_list,Sorted_list1).

insert(X,Sorted_list,[X|Sorted_list]).

/* Конец программы */

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

Идея быстрой сортировки следующая:

1. Убрать голову H.

2. С помощью процедуры div1 разбить список на два:

— меньший либо равный H (Small)

— больший H (Big)

3. Методом быстрой сортировки отсортировать списки Small и Big.

4. Соединить списки Small_sort и [H|Big_sort] с помощью процедуры conc.

Опишем предикат, производящий сортировку списка методом быстрой сортировки:

supersort(list,list)

Правила, реализующие этот способ сортировки, имеют следующую структуру:

supersort([],[]).

supersort([H|T],Sorted_list) :-

div1(H,T, Small,Big),

supersort(Small,Small_sort),

supersort(Big,Big_sort),

conc(Small_sort,[H|Big_sort],Sorted_list).

Процедуры conc и div1 уже были описаны ранее.