Вывод показывает разные

#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], чтобы решить проблему.

Другие вопросы по тегам