2016-03-04 3 views
-1

Я пытаюсь создать сортировку вставки в C. Мы использовали следующий код в школе, но он не работает.Вставка сортировка в c, требуется коррекция

#include <stdio.h> 
    #include <conio.h> 

    int main(int argc, char const *argv[]) 
    { 
     int a[6] = {5,8,3,2,9,1}; 
     int i,j, key; 
     int countArraySize = sizeof(a)/sizeof(int); 


     for (i = 0; i < countArraySize; ++i) 
     { 
      key = a[i]; 
      j = i - 1; 

      while(j>=0 && key < a[j]) { 
       a[j+1] = a[j]; 
       j--; 
      } 

      a[j+1] = key; 
      printf("%d\n", a[j+1]); 
     } 


     return 0; 
    } 

Спасибо.

+0

«это не работает» почти никогда не адекватное описание проблемы. Если вам нужна помощь, пожалуйста, найдите время, чтобы более четко объяснить свою проблему. В частности, укажите вход, ожидаемый результат/вывод и фактический результат/вывод (последние два отсутствуют). И вы пробовали каким-либо образом отладить это (кроме публикации на SO)? Например, используя отладчик? – kaylum

+0

Я дам вам подсказку: ваш 'printf' печатает каждый' ключ' в точке, в которой он встречается во входном массиве. То есть вы просто распечатываете несортированные значения массива. Как вы могли изменить код для распечатки отсортированных значений? – kaylum

+0

Совет. Распечатайте значения 'j' и подумайте об отрицательных индексах. –

ответ

2

Сортировка правильная, но вы просто распечатываете неправильную вещь. Вы не должны печататься во время сортировки. Как бы то ни было, код просто распечатывает каждый ключ, как он встречается на входе. Вместо этого печать должна быть сделана после сортировка завершена. То есть, удалить printf внутри текущего for цикла и поместить его в отдельный for петлю после того, как сортировка завершена:

for (i = 0; i < countArraySize; ++i) { 
    key = a[i]; 
    j = i - 1; 

    while(j>=0 && key < a[j]) { 
     a[j+1] = a[j]; 
     j--; 
    } 

    a[j+1] = key; 

    /* FOLLOWING LINE REMOVED */ 
    /* printf("%d\n", a[j+1]); */ 
} 

/* ADDED THIS BLOCK TO PRINT THE SORTED ARRAY */ 
for (i = 0; i < countArraySize; ++i) { 
    printf("%d\n", a[i]); 
} 
+0

кажется, что когда я печатал это в цикле на этапе, он был несортирован, поэтому сортировка выполняется только тогда, когда цикл закончен, тогда мы можем распечатать это. Спасибо за вашу помощь. это сработало –

Смежные вопросы