2016-09-27 6 views
-1
int main(void) 
{ 
    int a[5] = {36,24,10,6,12}; 
    int pass; 
    int i;  
    int hold; 

    /* bubble sort */ 
    /* loop to control number of passes */ 

    for(pass=1; pass<5; pass++){ 
     /* loop to control number of comparisons per pass */ 
     for(i=0; i<5; i++){ 
      if(a[i] > a[i+1]){ 
       hold = a[i]; 
       a[i] = a[i+1]; 
       a[i+1] = hold; 
      } 
     } 
    } 

    return 0; 
} 

В этой программе сортировки пузырьков оператор if сравнивает значение соседнего элемента. Если счетчик I равен 4, то если бы оператор был бы равен [4]> a [4 + 1], поэтому мой вопрос в том, что в массиве нет элемента [5], так как программа сравнивает и выполняет работу?Bubble Сортировать по C неправильный код! [Deitel C 6th Ed]

Я не понимал для (pass = 1; pass < 5; pass ++) loop. Для чего этот цикл работает? И почему цикл начинается с 1 и продолжается 4 раза вместо 5.

Кто-нибудь, пожалуйста, продемонстрируйте, как работает эта программа сортировки пузырьков? Ура!

+3

Код неправильный, он обращается за пределы массива. – Barmar

+3

Код у вас есть * не работает. Он имеет * неопределенное поведение *, потому что он индексирует массив за пределами границ. –

+0

Я нашел его из книги пользователя deitel! как это может быть неправильно? C Как программировать Dietel 6th Edition – Sairat

ответ

0

Ну, все ответили на это в комментариях, но никто не нашел времени, чтобы написать фактический ответ, поэтому я бы взял на себя эту роль.

первой вещи первый, вставленный код содержит ошибку в нем:
в то время как массив int a[5] имеет 5 членов [0..4],
при выполнении внутреннего цикла for(i=0; i<5; i++) данного i=4,
a[i+1] обращается a[5], который выходит за пределы массива, и его значение, вероятно, неожиданно.
Стоит отметить: поскольку значения значений int a[5] = {36,24,10,6,12}; очень малы, существует высокая вероятность (36/2^32), что код будет работать в любом случае, потому что a[5] будет иметь максимальное значение и не будет переопределен или перемещен.

, но если вы попытаетесь изменить значения до, скажем, int a[5] = {36,0xFFFFFFFF,10,6,12};, программа наверняка потерпит неудачу!

второй на другой Ваш вопрос:
с каждой итерации (проход), максимальное значение продувают в это место, и, следовательно, будет на месте ...
5 номеров, после размещения 4 на своем месте, последнее дается неявно.
и поэтому нет необходимости в 5-й итерации.

Кроме того, во втором случае для продолжения итераций принято исключать последние элементы из внутреннего цикла, поскольку они, как известно, находятся на своем месте.

int main(void) 
{ 
    int a[5] = {36,24,10,6,12}; 
    int pass; 
    int i;  
    int hold; 

    /* bubble sort */ 
    /* loop to control number of passes */ 

    for(pass=4; pass > 0; pass--){ /* pass counts down 4 iterations */ 
    /* loop to control number of comparisons per pass */ 
    /* 0..4, then 0..3 > 0..2, and lastly 0..1 */ 
    for(i=0; i<pass; i++){ 
     if(a[i] > a[i+1]){ 
     hold = a[i]; 
     a[i] = a[i+1]; 
     a[i+1] = hold; 
     } 
    } 
    } 
    return 0; 
} 
Смежные вопросы