Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Презентации 2часть / Лекция_21_Поиск и сортировка.ppt
Скачиваний:
26
Добавлен:
11.05.2015
Размер:
115.71 Кб
Скачать

Эффективность сортировки

Методы внутренней сортировки классифицируются по времени их работы.

Хорошей мерой эффективности может быть

число сравнений ключей - С

число пересылок элементов - Р.

Эти числа являются функциями С(n), Р(n) от числа сортируемых элементов n.

Быстрые (но сложные) алгоритмы сортировки требуют

при n порядка n lg2n сравнений т.е. их эффективность O(n lg2n)

Прямые (простые) методы - O(n2).

07/02/19

21

Прямые методы коротки, просто программируются

Быстрые усложненные методы требуют меньшего числа операций, но эти операции обычно сами более сложны чем у прямых методов

поэтому для достаточно малых n (n<50) прямые методы работают быстрее. Значительное

преимущество быстрых методов (в n/lg(n) раз) начинает проявляться при n>100.

07/02/19

22

Прямые методы внутренней сортировки можно разбить на три категории

– сортировка с помощью

обмена,

включения,

выбора

07/02/19

23

Метод прямого обмена

(пузырьковая сортировка)

Для i=1..n-1 выполняется следующий элементарный алгоритм:

начиная от n до i последовательно проверяем упорядоченность двух соседних элементов a[j].k и a[j-1].k, и если они не упорядочены, то меняем их местами.

В результате такого обмена минимальный элемент перемещается на место i

07/02/19

24

Программа метода прямого обмена

for i:=1 to n-1 do

for j:=n downto i do

if a[j-1].k>a[j].k then

begin

r:=a[j-1];

a[j-1]:=a[j];

a[j]:=r;

end;

07/02/19

25

Трассировка метода пузырька

8

6 2 5

1

i=1

8

6 2 1

5

i=1

8

6 1 2

5

i=1

8

1 6 2

5

i=1

1

8 6 2

5

i=2

1

8 6 2

5

i=2

1

8 2 6

5

i=2

1

2 8 6

5

i=3

1

2 8 5

6

i=3

1

2 5 8

6

i=4

1 2 5 6 8

07/02/19

26

Метод прямого включения

Допустим, что массив a[1..n] разбит на две части

a1...ai-1, ai...an

в первой части элементы упорядочены, во второй – нет.

При i=2 такое разбиение получается автоматически, т.к. массив из одного элемента тривиально упорядочен.

На каждом шаге i=2..n выполняем элементарный алгоритм:

берем очередной элемент r из неупорядоченной части и включаем его в «нужное» место упорядоченной части.

a1...ai-1, ai...an

Для поиска нужного места в нижеприведенном алгоритме используется барьер a[0].k:=x.

Элементы, начиная от i-1 до нужного j сдвигаются на одну позицию: a[j]:=a[j-1]

07/02/19

27

Программа метода прямого включения

for i:=2 to n do

begin

 

r:=a[i]; //элемент из неупор части

x:=a[i].k;//ключ этого элемента

 

a[0].k:=x; //барьер

 

j:=i;

 

while x<a[j-1].k do //поиск места

begin

 

a[j]:=a[j-1]; //сдвиг

 

j:=j-1;

 

end;

 

a[j]:=r;//вставка в нужное место

 

end;

 

 

07/02/19

28

Трассировка метода прямого включения

8 6 2 5 1

6

8

2 5 1

i=2 x=6 x<8

 

2

6

8 5 1

i=3 x=2 2<8 2<6

2

5

6 8 1

i=4 x=5 5<8

5<6

1 2 5 6 8 i=5 x=1 1<8 … 1<2

1 2 5 6 8

Сравните с методом пузырька.

Казалось бы меньше итераций, но здесь не показаны проверки при выборе места куда вставить очередной элемент

07/02/19

29

Метод прямого выбора

Для i=1..n-1 выполняется следующий элементарный

алгоритм: среди неупорядоченной части элементов

ai...an выбираем минимальный am и переставляем местами элементы i-й и m-й.

a1...ai-1, ai…am...an

В результате на первое место станет самый минимальный, на второе – следующий минимальный

и т.д

07/02/19

30