Совместное слияние двух массивов
Мы имеем массив размером m + n, в котором m элементов
присутствует в отсортированном порядке и второй массив размера n, снова в отсортированном порядке. Мы
хотите, чтобы оба они были отсортированы и присутствовали в первом массиве. Нет третьего массива
должен быть дан.
Пример:
1, 3, 55, 66, 77, _, _, _
5, 9, 20
Ответ будет следующим:
1, 3, 5, 9, 20, 55, 66, 77
Ответы
Ответ 1
Сделайте обычную сортировку слияния, но сначала сравните самые большие числа, сохранив (перевернувшись) в конец первого массива, идущего назад. Таким образом, элементы, которые вы объединяете, никогда не перезаписываются (это легко понять, если вы думаете об этом на мгновение).
Ответ 2
Переместить содержимое первого массива в конец первого массива, чтобы пустые элементы теперь находились в начале. Затем объедините две последовательности, как обычно, в первый массив.
Ответ 3
На месте в основном требуется использовать только "постоянный" объем памяти, который не изменяется с разными размерами входных массивов. Однако сам вопрос выделяет дополнительный объем памяти, который совпадает с размером одного из двух входных массивов, что является O (n) памятью в худшем случае. Это в основном делает идею "на месте" бессмысленной...
Вопрос может быть лучше сформулирован как "слияние без дополнительной памяти", что является более точным описанием его реального намерения...
Ответ 4
// merge the elements in B[] to A[], starting from the last one
void merge(int A[], int m, int B[], int n) {
// m-1 and n-1 represent the current element index in A[] and B[] respectively
while (n > 0) { // there are still elements in B[] not merged
if (m > 0 && A[m-1] > B[n-1]) { // current element in A[] > current element in B[]
A[m+n-1] = A[m-1]; // move current element of A[] to its right position
--m; // decrease current element index of A[]
}
else { // current element in A[] <= current element in B[]
A[m+n-1] = B[n-1]; // move current element in B[] to its right position
--n; // decrease current element index of B[]
}
}
}