Почему не выводится результат программы?
#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()