C/C++

День добрый \[-_-]/ вопрос по вузовскому программированию на си(C)

Собственно вопрос в том, почему программа не работает так, как должна
и, если можно, то рассказать почему в онлайн компиляторе и в обычном devC разный результат работы.
а, и при изменении значения в последнем принте, например, на 39 или замене условия того же цикла на <=39 программа начинает чудить ещё сильнее. странно ведь <40 и <=39 одно и то же, или я ошибаюсь?

само задание в фотографии ниже

программа:
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>


int main()
{
srand(_getpid());
int m,count,cnt,cnta,cntb;
int C[20],D[20],E[40];
for(count=0;count<20;count++ )
{
C[count]=rand()%20;
}

for(count=0;count<20;count++ )
{
D[count]=rand()%20;
}

for (count=0;count<20;count++)
{
for (cnt=0;cnt<20;cnt++)
{
if (C[cnt]>C[cnt+1])
{
m=C[cnt];
C[cnt]=C[cnt+1];
C[cnt+1]=m;
}
}
}

for (count=0;count<20;count++)
{
for (cnt=0;cnt<20;cnt++)
{
if (D[cnt]>D[cnt+1])
{
m=D[cnt];
D[cnt]=D[cnt+1];
D[cnt+1]=m;
}
}
}

for(count=0,cntb=0,cnta=0;count<40;count++)
{
if (C[cnta]<D[cntb])
{
E[count]=C[cnta];
cnta++;
}
else
{
E[count]=D[cntb];
cntb++;
}
}


printf("\n\n array C:\n");
for(count=0;count<20;count++)
{
printf("%d\t",C[count]);
}




printf("\n\n array D:\n");
for(count=0;count<20;count++)
{
printf("%d\t",D[count]);
}


printf("\n\n array E:\n");
for(count=0;count<40;count++)
{
printf("%d\t",E[count]);
}
}
Код сортировки ошибочен. При cnt == 19, cnt+1 == 20, C[cnt+1] -> C[20] - вне переделов массива.
Кроме того, код делает много лишних вычислений.

int flg = 1;
for (int i = 19; i > 0 && flg; --i) {
flg = 0;
for (int j = 0; j < i; ++j) {
if (C[i] > C[i + 1]) { int tmp = C[i]; C[i] = C[i + 1]; C[i + 1] = tmp; flg = 1; }
}
}

Сортировка D - аналогичная проблема.

Объединение тоже ошибочно: нет контроля окончания массивов C и D. Потому тоже получим выход за границы массива.

int i = 0, j = 0, k = 0;
for (;;) {
if (C[j] < D[k]) {
E[i++] = C[j++];
if (j >= 20) {
while (k < 20) { E[i++] = D[k++]; }
break;
}
} else {
E[i++] = D[k++];
if (k >= 20) {
while (j < 20) { E[i++] = C[j++]; }
break;
}
}
}
Владимир Тимохов
Владимир Тимохов
65 209
Лучший ответ
Судя по всему это бабл сорт..?
Что будет если ты будешь на i = 19 (последнем индексе) и обратишься i + 1?
20-ого индекса не существует.
Возможно, твои "причуды" - это просто неопределенное поведение твоей программы.

Хотяб глянь алгоритм:
ru.hexlet.io/courses/java-arrays/lessons/bubble-sort/theory_unit
Ozadbek Mamajanov
Ozadbek Mamajanov
73 465
А текстом кинуть исходник не судьба? +_-
Кирилл Цапурин
Кирилл Цапурин
37 945