Сортировка слиянием: Нужны ли дополнительные копии массива? - PullRequest
0 голосов
/ 29 ноября 2010

В разделе «Введение в алгоритмы» алгоритм сортировки слиянием реализован с помощью вспомогательной функции с именем MERGE(A, p, q, r), которая объединяет две ранее отсортированные последовательности.

Эта функция вводит два дополнительных массива L и R.

MERGE(A, p, q, r)
1 n1 ← q − p + 1
2 n2 ←r − q
3 create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]
.....

К "create arrays L[1 . . n1 + 1] and R[1 . . n2 + 1]" Я понимаю, как выделить дополнительную память для них обоих.

Можно ли переписать эту функцию, чтобы мне не требовалась дополнительная память, и работать напрямую с A?

Ответы [ 3 ]

2 голосов
/ 29 ноября 2010

Конечно. Это называется сортировкой слиянием на месте.

Википедия говорят, что это сложно - но это не всегда так. Некоторые не такие сложные, как другие , если вы не заботитесь о времени выполнения .

Есть несколько отклонений, некоторые стабильны, некоторые нестабильны. См. Раздел «реализация» в разделе NIST DIAGS , где приведен пример.

1 голос
/ 29 ноября 2010
1 голос
/ 29 ноября 2010

Да, это называется сортировкой слиянием на месте, но, как говорит Википедия :

Сортировка на месте возможна (например, с использованием списков, а не массивов), но она очень сложна и на практике даст небольшой выигрыш в производительности, даже если алгоритм выполняется за O (n log n) времени. (Katajainen, Pasanen & Teuhola 1996)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...