Объединение упорядоченных массивов в новый упорядоченный массив

Всем хай. Мне нужно объединить 2 упорядоченных массива и чтобы из первого перешли только нечетные элементы а из второго четные. Нужно чтобы получился также упорядоченный массив на возрастание. Помогите найти ошибку что не так. Вот мой код:

void joinSortArrays(int arr[],int arr2[],int arr3[],int size,int size2,int &size3)
{
int k=0,i=0,j=0;
// текущие индексы для первого, второго и третьего массивов            
while(i<size && j<size2)
{
    if(arr[i]<arr2[j] && arr[i]%2!=0)
    // добавляем элементы с первого массива
    {
        arr3[k++]=arr[i++];
    }
    else if(arr2[j]%2==0)
    // добавляем элементы со второго массива
    {
        arr3[k++]=arr2[j++];
    }
}
for(i=i;i<size;i++,k++) // Добавляем остаток с первого массива, если он есть
{
    if(arr[i]%2!=0)
    {
    arr3[k]=arr[i];
    }
}
for(j=j;j<size2;j++,k++) // Добавляем остаток с второго массива, если он есть
{
    if(arr2[j]%2==0)
    {
    arr3[k]=arr2[j];
    }
}
size3=k;
}

Ответы (3 шт):

Автор решения: Павел Ериков

Ошибка была в том, что вы не пропускаете ненужные числа из-за этого происходил бесконечный цикл. Так же обратите внимание на последние 2 цикла, там была ошибка с увеличением k.

void joinSortArrays(int arr[], int arr2[], int arr3[], int size, int size2,int& size3)
{
    int k = 0, i = 0, j = 0;
    // текущие индексы для первого, второго и третьего массивов            
    while (i < size && j < size2)
    {
        //Пропускаем четные числа из 1 массива
        while (i < size && arr[i] % 2 == 0) ++i;
        //Пропускаем нечетные числа из 2 массива
        while (j < size2 && arr2[j] % 2 == 1) ++j;
        //Если мы дошли до конца какого-либо массива то выходим
        if (i >= size || j >= size2) break;
        if (arr[i] < arr2[j]) 
            // добавляем элементы с первого массива
        {
            arr3[k++] = arr[i++];
        }
        else // добавляем элементы со второго массива
        {
            arr3[k++] = arr2[j++];
        }
    }
    for (i = i; i < size; i++) // Добавляем остаток с первого массива, если он есть
    {
        if (arr[i] % 2 != 0)
        {
            //Тут идет проверка на нечетность но при этом k увеличивалось всегда не в зависимости от проверки
            arr3[k++] = arr[i];
        }
    }
    for (j = j; j < size2; j++) // Добавляем остаток с второго массива, если он есть
    {
        if (arr2[j] % 2 == 0)
        {
            //Тут было так же как и в цикле выше
            arr3[k++] = arr2[j];
        }
    }
    size3 = k;
}
→ Ссылка
Автор решения: Stanislav Volodarskiy

Предположим arr[0] чётное, а arr2[0] нечётное. Тогда цикл while никогда не продвинется.

Чтобы это исправить нужно выполнять правило: сравнивать элементы можно только после проверки на чётность. Проверка на чётность для arr может выглядеть так:

while (i < size && arr[i] % 2 == 0) {
    ++i;
}

После того как она прошла вам ещё нужно проверить что вы не выпали из массива. И если выпали, то выйти из большого цикла:

if (i >= size) {
    break;
}

Тоже самое вы делаете для arr2. И когда все условия выполнены, только тогда делаете копирование:

assert(i < size);
assert(arr[i] % 2 == 1);
assert(j ...);
assert(arr2[j] ...);
if (arr[i] < arr2[j]) {
    arr3[k++] = arr[i++];
} else {
    ...
}
→ Ссылка
Автор решения: AR Hovsepyan

Вот вам еще одну:

void joinSortArrays(int arr[], int arr2[], int arr3[], int size, int size2, int& size3)
{
    int k = 0, i = 0, j = 0;
    // текущие индексы для первого, второго и третьего массивов            
    while (i < size)
    {
        if (j == size2) {
            if(arr[i] % 2)
               arr3[k++] = arr[i];
            ++i;
            continue;
        }

        if (arr2[j] < arr[i]) {
            if (arr2[j] % 2 == 0)
                arr3[k] = arr2[j];
            ++j;
        }
        else {
            if (arr[i] % 2)
                arr3[k] = arr[i];
            ++i;
        } 
        ++k;              
    }
    for (;j < size2, k < size3; ++j)
        if (arr2[j] % 2 == 0)
            arr3[k++] = arr2[j];
}
→ Ссылка