В теле вашего метода измените:
for (i=0;i++;i<n)
for (j=0;i++;j<n)
на следующее:
for (i=0; i<n; i++)
for (j=0; j<n; j++)
, а затем измените вызов вашего метода следующим образом:
interclas(ptr, vec, &c, n);
к этому:
interclas(ptr, vec, c, n);
, поскольку прототип ожидает указатель на int
для третьего параметра.
Лог c вашего метода также испорченный, попробуйте поместить несколько printfs (например, printf("here i = %d, j = %d, ptr[i] = %d, vec[j] = %d, tmp = %d\n", i, j, ptr[i], vec[j], tmp);
), чтобы увидеть, какие значения имеют ваши переменные на его итерации - вы получите только первые два элемента первого массива для объединения!
Если вы думаете об этом что вы хотите сделать, это go через первый элемент массива ptr
и vec
и сохранить минимум этих двух. Если бы теперь этот min имел массив ptr
, вы бы хотели, чтобы следующий элемент ptr
был принят во внимание, в противном случае следующий элемент vec
.
Возьмите карандаш и бумагу и Сделайте набросок этого алгоритма - вы увидите, что он хорошо работает, но некоторые оставшиеся элементы могут остаться и не вставляться в выходной массив.
Выводится из этого наблюдения после обхода обоих массивов и сравнения элементы, мы будем l oop над первым массивом, если необходимо, чтобы собрать элементы, которые не были посещены. Аналогично для второго массива.
Кодирование этой мысли дает что-то вроде этого:
void interclas(int *ptr,int *vec, int *c, int n) {
int i = 0, j = 0, tmp = 0;
// Traverse both arrays simultaneously,
// and choose the min of the two current elements.
// Increase the counter of the array who had
// the min current element.
// Increase the counter for the output array in
// any case.
while(i < n && j < n)
{
if(ptr[i] < vec[j])
{
c[tmp++] = ptr[i++];
}
else
{
c[tmp++] = vec[j++];
}
}
// Store remaining elements of first array
while (i < n)
c[tmp++] = ptr[i++];
// Store remaining elements of second array
while (j < n)
c[tmp++] = vec[j++];
}
Не источник вашей проблемы, но Я приведу результат mallo c? №