Объединение упорядоченных массивов в новый упорядоченный массив
Всем хай. Мне нужно объединить 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;
}
Предположим 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 {
...
}
Вот вам еще одну:
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];
}