Вывод показывает разные
#include<stdio.h>
int main()
{
int a[6]={2,5,4,6,1,3};
int j,key,i,k;
for(j=1;j<6;++j)
{
key=a[j];
i=j-1;
while((i>=0)&&(a[i]>key))
{
a[i+i]=a[i];
i=i-1;
}
a[i+1]=key;
}
for(i=0;i<6;i++)
printf("%d\n",a[i]);
}
когда я вычисляю себя, я получаю 1,2,3,4,5,6, но на выходе получается 2,4,5,6,1,3.
Я так старался, но не смог найти неправильного в этом, пожалуйста, если ответ так прост, или это моя вина в написании кода, не понижайте голос, ответьте мне, что не так, может быть, мое последнее переполнение стека вопросов заблокирует меня после этого,
3 ответа
В вашей программе есть опечатка.
Вместо
a[i+i]=a[i];
там должно быть
a[i+1]=a[i];
Учтите, что в соответствии со стандартом C функция main без параметров должна быть объявлена как
int main( void )
Также плохая идея использовать "сырые числа" во всей программе.
Желательно поместить сортировку в отдельную функцию.
Соответствующая программа может выглядеть как
#include <stdio.h>
void insertion_sort(int *a, size_t n)
{
for (size_t i = 1; i < n; i++)
{
size_t j = i;
int value = a[i];
for (; j != 0 && value < a[j - 1]; --j)
{
a[j] = a[j - 1];
}
if (j != i) a[j] = value;
}
}
int main( void )
{
int a[] = { 2, 5, 4, 6, 1, 3 };
const size_t N = sizeof(a) / sizeof(*a);
for (size_t i = 0; i < N; i++)
{
printf("%2d ", a[i]);
}
putchar('\n');
insertion_sort(a, N);
for (size_t i = 0; i < N; i++)
{
printf("%2d ", a[i]);
}
putchar('\n');
return 0;
}
Его вывод
2 5 4 6 1 3
1 2 3 4 5 6
Для больших массивов лучше использовать бинарный поиск, а не последовательные сравнения.
Ошибка в строке [i+i]=a[i]. Это должна быть строка [i+1]. Когда у вас i+i(и i>=3), она пытается получить доступ к индексу, по которому вы работаете. не знаю, что происходит, потому что это не пространство.
Здесь Ваш размер массива составляет 6 . Как вы объявили A[6] . Теперь рассмотрим случай i=4, поэтому в этой строке a[i+i]=a[i];
вы пытаетесь получить доступ a[4+4]=a[4]
, Вы не можете получить доступ к индексу а [8]. Просто измените [i+i] на [i+1], чтобы решить проблему.