Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Билеты на зачет.docx
Скачиваний:
51
Добавлен:
01.06.2015
Размер:
554.66 Кб
Скачать

37. Сортировка слиянием (простое слияние, двухпутевое слияние, рекурсивный алгоритм слияния) Сортировка слиянием

Исторически метод слияния является одним из первых методов, предложенных для сортировки на ЭВМ еще в 1954 году, автором его является Джон фон Нейман.

Слияние означает объединение двух или более упорядоченных массивов в один упорядоченный массив. Например, слияние двух массивов – [5 8 9] и [1 3 4 10] дает массив [1 3 4 5 8 9 10]. Сделать это можно, сравнив два наименьших элемента, вывести наименьший из них, а затем повторить эту процедуру. Необходимо позаботиться о действиях на случай когда один из массивов будет исчерпан.

5

8

9

1

3

4

10

 

 

 

выбираем 1

5

8

9

1

3

4

10

1

 

 

 

выбираем 3

5

8

9

1

3

4

10

1

3

 

 

 

выбираем 4

5

8

9

1

3

4

10

1

3

4

 

 

 

выбираем 5

5

8

9

1

3

4

10

1

3

4

5

 

 

 

выбираем 8

5

8

9

1

3

4

10

1

3

4

5

8

 

 

выбираем 9

5

8

9

1

3

4

10

1

3

4

5

8

 

выбираем 10

5

8

9

1

3

4

10

1

3

4

5

8

10 

Слияние намного более простая процедура, чем сортировка, так как общий объем работы по существу пропорционален количеству элементов m+n, но при этом используется дополнительный массив.

Алгоритм двухпутевого слияния реализован в следующей программе для отсортированных массивов x[1..m],y[1..n] с результирующим массивомz[1..n+m]. Небольшое упрощение введено добавлением в конец исходных файлов искусственных стражейxm+1=yn+1=.

procedureMerge( x : VectorM; y : VectorN;varz: VectorNM);vari, j, k: integer;begini := 1; j := 1; x[m+1] := MaxInt; y[n+1] := MaxInt;fork := 1toN+Mdoifx[i] <= y[j]thenbeginz[k] := x[i]; Inc(i)endelsebeginz[k] := y[j]; Inc(j)end;end;

Простое слияние

Алгоритм слияния, предложенный фон Нейманом, упорядочивает пары соседних чисел. Затем упорядоченные пары сливаются в упорядоченные четверки, восьмерки и т.д. Для хранения упорядоченных серий используется вспомогательный массив Y.

X

1

7

3

6

4

2

8

5

Y

1

7

3

6

2

4

5

8

X

1

3

6

7

2

4

5

8

Y

1

2

3

4

5

6

7

8

Этот алгоритм называется иногда вверх-направленным слиянием, учитывая направление сливаемых пар.

При слиянии можно выбирать не соседние пары, а элементы, стоящие на концах массива. Алгоритм простого двухпутевого слияния берет элементы с двух концов исходного массива, сливает их в упорядоченные пары и отправляет по очереди в два конца выходного массива.

X17 3 6 4 2 85

Y1 52 36 48 7

X1 5 7 86 4 3 2

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]