Проблема: учитывая K отсортированных массивов размером N каждый, объедините их и напечатайте отсортированный вывод.
Sample Input-1:
K = 3, N = 4
arr[][] = { {1, 3, 5, 7},
{2, 4, 6, 8},
{0, 9, 10, 11}} ;
Sample Output-1:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
Я знаю, что есть способ решить эту проблему, используя очередь с приоритетами / мин, ноЯ хочу сделать это с помощью процедуры слияния от mergeSort.Идея кажется достаточно простой ... на каждой итерации объединять оставшиеся массивы в группы по два, так что число массивов уменьшается вдвое на каждой итерации.
Однако, если деление на два приводит к нечетному числу, этостановится проблематичным.Моя идея состоит в том, что всякий раз, когда деление пополам приводит к нечетному числу, мы заботимся о дополнительном массиве, объединяя его с массивом, сформированным из последнего слияния.
Код, который я имею до сих пор, приведен ниже.Однако это работает только в одном из 30 тестовых случаев:
static int[] mergeArrays(int[][] arr) {
int k = arr.length;
int n = arr[0].length;
if(k < 2){
return arr[0];
}
boolean odd_k;
if(k%2){
odd_k = false;
}
else{
odd_k = true;
}
while(k > 1){
int o;
if(odd_k){
o = (k/2) + 1;
}
else{
o = k/2;
}
int[][] out = new int[o][];
for(int i=0; i < k; i = i + 2){
int[] a;
int[] b;
if(odd_k && i == (k-1)){
b = arr[i];
b = out[i-1];
}
else{
a = arr[i];
b = arr[i+1];
}
out[i] = mergeTwo(a, b);
}
k = k/2;
if(k % 2 == 0){
odd_k = false;
}
else{
odd_k = true;
}
arr = out;
}
return arr[0];
}
static int[] mergeTwo(int[] a, int[] b){
int[] c = new int[a.length + b.length];
int i, j, k;
i = j = k = 0;
while(i < a.length && j < b.length){
if(a[i] < b[j]){
c[k] = a[i];
i++;
k++;
}
else{
c[k] = b[j];
j++; k++;
}
}
if(i < a.length){
while(i < a.length){
c[k] = a[i];
i++; k++;
}
}
if(j < b.length){
while(j < b.length){
c[k] = b[j];
j++; k++;
}
}
return c;
}