Почему не выводится результат программы?

#include <stdio.h>
#include <stdbool.h>

#define ALLOCATE_SIZE 1000

int input_array(int *A, int max_size)
{
int top = 0;
while  (true)
{
    int x;
    scanf("%d", &x);
    if (x == 0 || top == max_size) break;
    A[top] = x;
    top++;
}
return top;
}
void print_array(int *A, int N)
{
    for(int i = 0; i < N; i ++)
        printf("%3d", A[i]);
    printf("\n");
}
void insert_sort(int *A, int N)
{
     // перебираем цикл для доступа к элементам //
    // начиная со второго элемента //
    for(int i = 1; i < N; i++)
    {
        // вставка начинается с позиции равной i //
        // важно помнить старый i //
        int k = i;
        // двигаем влево пока кто-то есть слева //
        // и тот, кто слева, он больше, чем A[k] //
        while(k > 0 || A[k - 1] > A[k])
        {
            // далее меняем местами через временную переменную //
            int tmp = A[k - 1];
            A[k - 1] = A[k];
            A[k] = tmp;
            // сдвигаем позицию влево //
            k -= 1;
        }
    }
}
int main() {
    printf("Введите числа: ");
    int A[ALLOCATE_SIZE];
    int N;

    N = input_array(A, ALLOCATE_SIZE);
    insert_sort(A, N);
    print_array(A, N);
    return 0;
}

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

Автор решения: DmitryK

Ваша функция сортировки нерабочая. Цикл уходит за границы массива в отрицательную сторону. На первом шаге k==1, потом в цикле она становится k==0. И поскольку в условии стоит логическое или, в условии цикла вы делаете проверку A[-1] > A[0]. Это уже неопределенное поведение, чаще всего крах программы. А если что-то, что лежит в памяти по адресу A[-1] случайно больше A[0], вы начинаете сравнивать A[-2] > A[-1]. Мало того что сравнивать, начинаете менять значения.

while(k > 0 || A[k - 1] > A[k])
{
   k -= 1;
}

Решается просто.

while(k > 0)
{
  if(A[k - 1] > A[k])
  { // здесь обмен значений
  }
  k--;
}

И вместо обмена значений вручную я бы рекомендовал использовать swap()

→ Ссылка