Тема 25 АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ НА СВЯЗАНЫХ

Скачать презентацию Тема 25 АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ НА СВЯЗАНЫХ Скачать презентацию Тема 25 АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ НА СВЯЗАНЫХ

Лекция_25_Поиск и сортировка списка.ppt

  • Количество слайдов: 32

Тема 25. АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ НА СВЯЗАНЫХ ЛИНЕЙНЫХ СПИСКАХ Ø Поиск в однонаправленных Тема 25. АЛГОРИТМЫ ПОИСКА И СОРТИРОВКИ НА СВЯЗАНЫХ ЛИНЕЙНЫХ СПИСКАХ Ø Поиск в однонаправленных списках § Поиск заданного элемента § Поиск элемента после заданного Ø Сортировка однонаправленных списков § Пузырьковая сортировка § Сортировка слиянием 2/13/2018 1

Используем рекурсивный тип данных • Type • // описание данных, содержащихся в ячейках списка Используем рекурсивный тип данных • Type • // описание данных, содержащихся в ячейках списка • • • Tinf=record; информационные поля: <ТИП> Key: Tkey; // поле ключа как одно из полей end; //рекурсивный тип Tsel=^sel; sel=Record Inf: TInf; // информация об элементе списка A: Tsel; //Адрес ячейки такого же типа end; • • • Var • sp, sp 1, spk: Tsel; //указатели на ячейки списка 2/13/2018 2

Создаем класс для работы со списком • Type Tlist=class(Tobject) • sp 1, spk, sp: Создаем класс для работы со списком • Type Tlist=class(Tobject) • sp 1, spk, sp: Tsel; • constructor create; • procedure Add 1(Inf: Tinf); • procedure Addk(Inf: Tinf); • procedure Read 1(Inf: Tinf); • Function Tlist. Poisk(K: TKey): Tsel; • . . . • procedure Print; • end; • constructor Tlist. create; • begin • inherited create; • sp 1: =nil; spk: =nil; • end; Ø Будем добавлять в этот класс новые методы 2/13/2018 3

Поиск адреса элемента, который содержит заданный ключ K в информационном поле Inf. key • Поиск адреса элемента, который содержит заданный ключ K в информационном поле Inf. key • Function Tlist. Poisk(K: TKey): Tsel; • begin • if sp 1=Nil then Resalt: =Nil else • begin//если список не пуст • sp: =sp 1; • While(sp^. Inf. key<>K) and (sp^. A<>Nil) • do sp: =sp^. A; • • if sp^. Inf. key<>K then else end; Result: =Nil Result: =sp end; sp 1 spk I 1 2/13/2018 A 1 I. key=k A 2 sp …. Ik-1 Ak-1 Ik nil 4

Обращение • Var List: Tlist; sp: Tsel; • inf: Tinf; Kl: Tkey; • • Обращение • 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; 2/13/2018 5

Поиск адреса элемента списка с меткой, после которого находится элемент, содержащий заданный ключ K Поиск адреса элемента списка с меткой, после которого находится элемент, содержащий заданный ключ K в информационном поле Inf. key • Function Tlist. Poisk. After(k: Tkey): Tsel; • begin • if sp 1^. A=Nil then Resalt: =Nil • else • begin//если элементов больше чем один • sp: =sp 1; • While(sp^. A^. Inf. key<>k) and (sp^. A<>Nil) • do sp: =sp^. A; • if sp^. A^. Inf. key<>k then Result: =Nil • else Result: =sp; • end; sp 1 spk Метка 2/13/2018 A I 1 A 1 …. Ik-1 sp Ak-1 I. key=k nil 6

 • Работа со списком • Var List: Tlist; sp: Tsel; • inf: Tinf; • Работа со списком • Var List: Tlist; sp: Tsel; • inf: Tinf; Kl: Tkey; • begin • List: =Tlist. Create; //создать список c меткой • sp: =List. poisk. After(kl); //найти • If sp<>nil then Write(sp. A. inf); • . . • List. Free; • Эффективность O(n), • т. е. Коп<=C*n при n , C – не зависит от n 2/13/2018 7

Два метода пузырьковой сортировки Ø При выводе данных полезно список упорядочить (отсортировать) по ключу. Два метода пузырьковой сортировки Ø При выводе данных полезно список упорядочить (отсортировать) по ключу. Ø Метод пузырьковой сортировки основан на последовательной перестановке местами двух соседних элементов. Ø Поменять местами два соседних элемента в однонаправленном списке можно двумя способами: § С помощью обмена информации § С помощью обмена адресами 2/13/2018 8

Перестановка элементов с помощью обмена информации • Procedure Rev. Inf(sp: Tsel); • Var Inf: Перестановка элементов с помощью обмена информации • Procedure Rev. Inf(sp: Tsel); • Var Inf: TInf; • begin • Inf: =sp^. Inf; // 1 • sp^. Inf: =sp^. A^. Inf; // 2 • sp^. A^. inf: =Inf; // 3 • end; Inf 1 sp 1 … Ik 3 Ak Ik-1 spk Ak-1 …. Ik nil 2 2/13/2018 sp 9

Перестановка элементов с помощью обмена ключами • • Procedure Rev. After(spi: Tsel); Var sp: Перестановка элементов с помощью обмена ключами • • Procedure Rev. After(spi: Tsel); Var sp: Tsel; begin sp: =spi^. A; // 1 spi^. A: =sp^. A; // 2 sp^. A: =spi^. A; // 3 spi^. A: =sp; // 4 end; spi Inf 3 A Inf 2 A Inf A 1 4 2/13/2018 sp 10

сортировка стека пересылкой информации • Procedure Tlist. Sort. Bubl. Inf; • Procedure Rev. Inf(spi: сортировка стека пересылкой информации • Procedure Tlist. Sort. Bubl. Inf; • Procedure Rev. Inf(spi: Tsel); • Begin. . . end; • Var spt: Tsel; • begin • spt: =Nil; • Repeat • sp: =sp 1; • While sp^. A<>spt do begin • if sp^. Inf. key>sp^. A^. Inf. key then Rev. Inf(sp); • sp: =sp^. A; • end; • spt: =sp; //запомнили последний • Until sp 1^. A=spt; • end; 2/13/2018 11

Иллюстрация сортировки стека методом пузырька sp 1 I 1 A 1 I 2 A Иллюстрация сортировки стека методом пузырька sp 1 I 1 A 1 I 2 A 2 …. Ik-1 Ak-1 Ik nil sp spt sp 1 I 1 A 1 I 2 A 2 …. Ik-1 Ak-1 sp Ik nil spt sp 1 I 1 sp 2/13/2018 A 1 I 2 spt A 2 …. Конец сортировки Ik-1 Ak-1 Ik nil 12

сортировка стека с меткой пересылкой ключей • Procedure Tlist. Sort. Bubl. Adr; • Procedure сортировка стека с меткой пересылкой ключей • Procedure Tlist. Sort. Bubl. Adr; • Procedure Rev. After(spi: Tsel); • Begin. . . end; • Var spt: Tsel; • begin • spt: =Nil; • Repeat • sp: =sp 1; • While sp^. A<>spt do • begin • if sp^. A^. Inf. key>sp^. A^. Inf. key • then Rev. After(sp); • sp: =sp^. A; • end; • spt: =sp^. A; //запомнили последний • Until sp 1^. A=spt; • end; 2/13/2018 13

Иллюстрация сортировки стека методом пузырька sp 1 I 1 A 1 I 2 …. Иллюстрация сортировки стека методом пузырька sp 1 I 1 A 1 I 2 …. A 2 Ik-1 Ak-1 Ik nil sp spt sp 1 I 1 A 1 I 2 …. A 2 Ik-1 Ak-1 sp Ik nil spt sp 1 I 1 2/13/2018 sp A 1 I 2 A 2 I 3 spt A 3 …. Конец сортировки Ik nil 14

 • Работа со списком • Var List: Tlist; sp: Tsel; • inf: Tinf; • Работа со списком • Var List: Tlist; sp: Tsel; • inf: Tinf; Kl: Tkey; • • • begin List: =Tlist. Create; //создать список безметки Заполнить список, например из файла List. Add 1(List. sp 1. Inf); //добавить метку sp: =List. Sort. Bubl. Adr(kl); //сортировать List. Read 1(List); //удалить метку • . . • List. Free; • Эффективность O(n), 2/13/2018 • т. е. Коп<=C*n при n , C – не зависит от n 15

сортировка очереди слиянием Рекурсивное соотношение • Тривиальная задача: • Очередь из одного элемента trn(1, сортировка очереди слиянием Рекурсивное соотношение • Тривиальная задача: • Очередь из одного элемента trn(1, 1) – отсортирована • Элементарная подзадача: (Slip) • Слияние двух отсортированных очередей в одну отсортированную • Рекурсивное соотношение: • Sorsl[trn(1, k)]=Slip[Sorsl[trn(1, k/2)], Sorsl[trn(k/2+1, k)] 2/13/2018 16

Сортировка очереди слиянием • • • Procedure Sorsl(var tp: Tlist); Var tq, tr: Tlist; Сортировка очереди слиянием • • • Procedure Sorsl(var tp: Tlist); Var tq, tr: Tlist; begin if tp. sp 1<>tp. spk then begin Div 2 sp(tp, tq, tr); Sorsl(tq); Sorsl(tr); Slip(tq, tr, tp); end; Ø Сначала весь список будет разбит на списки по одному элементу, затем они будут сливаться в списки по 2 упорядоченных, затем по 3 -4 упорядоченных…-пока не сольются в один упорядоченный. 2/13/2018 17

Слияние двух отсортированных очередей в одну отсортированную (Slip) Ø Допустим, что есть две отсортированных Слияние двух отсортированных очередей в одну отсортированную (Slip) Ø Допустим, что есть две отсортированных в порядке возрастания очереди (tq, tr: Tlist) Ø Схему алгоритма их слияния в одну отсортированную очередь tp: Tlist можно представить в виде tq tp 2/13/2018 tr 18

Procedure Slip • • Procedure Slip(tq, tr, tp: Tlist); Var Inf: TInf; Begin While(tq. Procedure Slip • • Procedure Slip(tq, tr, tp: Tlist); Var Inf: TInf; Begin While(tq. sp 1<>Nil) and (tr. sp 1<>Nil) do if tq. sp 1. Inf. keynil do begin tq. Read 1(Inf); tp. Addk(Inf); end; • • • while tr. sp 1<>nil do begin tr. Read 1(Inf); tp. Addk(Inf); end; 2/13/2018 19

Разбиение одной очереди на две очереди tp tq tr 2/13/2018 20 Разбиение одной очереди на две очереди tp tq tr 2/13/2018 20

Procedure Div 2 sp • Procedure Div 2 sp(tp: TList; var tq, tr: TList); Procedure Div 2 sp • Procedure Div 2 sp(tp: TList; var tq, tr: TList); • Var Inf: TInf; C: shortint; • begin • tq: =Tlist. create; • tr: =Tlist. create; • c: =-1; • While tp. sp 1<>Nil do • begin c: =-c; • tp. Read 1(Inf); • If C>0 then tq. Addk(Inf) • else tr. Addk(Inf); • end; 2/13/2018 21

Погружение в метод класса • Procedure Tlist. Sortslip; • Procedure Slip(tq, tr, tp: Tlist); Погружение в метод класса • Procedure Tlist. Sortslip; • Procedure Slip(tq, tr, tp: Tlist); • Begin. . . End; • Procedure Div 2 sp(tp: TList; var tq, tr: TList); • Begin. . . End; • Procedure Sorsl(var tp: Tlist); • Begin. . . End; • • • begin Sorsl(self); end; 2/13/2018 22

Пример класса • • • Tlist=class(Tobject) sp 1, spk, sp: Tsel; constructor create; procedure Пример класса • • • Tlist=class(Tobject) sp 1, spk, sp: Tsel; constructor create; procedure Add 1(Inf: Tinf); Procedure Addk(Inf: TInf); procedure Read 1(var Inf: Tinf); procedure Writ(var stg: Tstringgrid); procedure Addn(n: word; stg: Tstringgrid); Procedure Sort. Bubl. Inf; Procedure Sortslip; end; 2/13/2018 23

Чтение из String. Grid в список • • • Procedure Tlist. Addn; var k: Чтение из String. Grid в список • • • Procedure Tlist. Addn; var k: word; Inf: Tinf; begin for i: =1 to n do begin inf. I 1: = stg. cells[1, i]; inf. key: =Str. Toint(stg. cells[0, i]); addk(inf); end; 2/13/2018 24

Вывод списка в String. Grid • Procedure Tlist. Writ; • var k: word; • Вывод списка в String. Grid • Procedure Tlist. Writ; • var k: word; • begin • sp: =sp 1; k: =0; • While sp <> Nil do • begin k: =k+1; • stg. cells[1, k]: =sp^. Inf. I 1; • stg. cells[0, k]: =Inttostr(sp^. Inf. key); • sp: =sp^. A; • end; 2/13/2018 25

Пример формы 2/13/2018 26 Пример формы 2/13/2018 26

Управляющие кнопки • Unit 1; • . . . • var • trn: Tlist; Управляющие кнопки • Unit 1; • . . . • var • trn: Tlist; • Inf: Tinf; n: word; • • • //ввод n, изменение размера и настройка String. Grid procedure TForm 1. Edit 1 Change(Sender: TObject); begin n: =strtoint(edit 1. text); String. Grid 1. Row. Count: =n+1; String. Grid 2. Row. Count: =n+1; String. Grid 1. Cells[0, 0]: ='key'; String. Grid 1. Cells[1, 0]: ='I 1'; String. Grid 2. Cells[0, 0]: ='key'; String. Grid 2. Cells[1, 0]: ='I 1'; end; 2/13/2018 27

Управляющие кнопки • procedure TForm 1. Button 1 Click(Sender: TObject); • Begin //Читать список Управляющие кнопки • procedure TForm 1. Button 1 Click(Sender: TObject); • Begin //Читать список из String. Grid • trn: =Tlist. create; • trn. Addn(n, String. Grid 1); • end; • procedure TForm 1. Button 2 Click(Sender: TObject); • Begin //Вывод списка • trn. Writ(String. Grid 2) • end; • procedure TForm 1. Button 3 Click(Sender: TObject); • Begin //Сортировка • case Radio. Group 1. Item. Index of • 0: trn. Sort. Bubl. Inf; • 1: trn. Sortslip; • end; 2/13/2018 • end; 28

Управляющие кнопки • //вызов сортировок • procedure TForm 1. Button 1 Click(Sender: TObject); • Управляющие кнопки • //вызов сортировок • procedure TForm 1. Button 1 Click(Sender: TObject); • begin • case Radio. Group 1. Item. Index of • 0: trn. Sort. Bubl. Inf; • 1: trn. Sortslip; • 2: begin • trn. Add 1(trn. sp 1. Inf); //добавить метку • trn. Sort. Bubl. Adr; • trn. Read 1(Inf); //убрать метку • end; 2/13/2018 29

Выводы Ø Сортировка однонаправленной очереди методом слияния не требует дополнительной памяти, в отличие от Выводы Ø Сортировка однонаправленной очереди методом слияния не требует дополнительной памяти, в отличие от такой же сортировки массива. Ø Ø Если требуется отсортировать файл или массив, то его считывают в список, сортируют и отсортированный список снова записывают в файл или массив. Ø Ø При небольших объемах информации в ячейках сортировка слиянием является одной из самых эффективных. Ø Если информационные ячейки имеют большой объем, то более эффективной является сортировка обменом ключей. 2/13/2018 30

Контрольные вопросы Ø Напишите метод поиска адреса элемента списка, содержащего заданный ключ. Ø Напишите Контрольные вопросы Ø Напишите метод поиска адреса элемента списка, содержащего заданный ключ. Ø Напишите метод поиска адреса элемента списка, предшествующего тому, который содержит заданный ключ. Ø Опишите последовательность действий при замене местами двух соседних элементов в списке методом перестановки адресов и методом обмена информацией. Ø Напишите метод сортировки стека с меткой методом перестановки адресов. Ø Напишите метод сортировки стека методом обмена информацией. Ø Опишите последовательность действий при сортировке стека методом слияния. 2/13/2018 31

Задачи на экзамен 10. Ввести массив записей {a[i]: TInf } (Inf. F - фамилия; Задачи на экзамен 10. Ввести массив записей {a[i]: TInf } (Inf. F - фамилия; Inf. к учетный номер) из String. Grid 1 в стек с меткой, отсортировать стек методом пузырька с обменом ключами, вывести отсортированный стек в String. Grid 2. 11. Ввести массив записей {a[i]: TInf } (Inf. F - фамилия; Inf. к учетный номер) из String. Grid, в односвязный список в виде очереди, отсортировать очередь методом слияния, вывести отсортированный список в String. Grid 2. Ø Алгоритмы записи, чтения элементов списка и его сортировки оформить в отдельном модуле в виде методов класса. 2/13/2018 32