2015-01-24 4 views
0

Я пытаюсь понять, что не так с моим кодом, но я новичок в C, но я запрограммировал широко в java. Я сделал свою собственную «ленивую» реализацию для сортировки пузырьков с использованием 8 целых чисел, однако это приводит к бесконечному циклу.Пользовательские Bubble Сортировать в C

какое-то объяснение: попытки сортировать 8 целых наибольшего к наименьшему и с помощью счетчика, чтобы определить, когда все значения сортируются

#include <stdio.h> 
int main() 
{ 
int array[8]; 
int counter =0; 
int storage=0; 
int i; 
printf("Please enter 8 numbers:"); 
scanf("%d%d%d%d%d%d%d%d",&array[0],&array[1],&array[2],&array[3],&array[4],&array[5],&array[6],&array[7]); 
while (counter!=7) 
{ 
    counter =0; 
for (i=0; i<=6;i++) 
{ 
    if (array[i]<=array[i++]) 
    { 
     storage = array[i]; 
     array[i]= array[i++]; 
     array[i++]= storage; 
    } 
    else 
    { 
     counter++; 
    } 
} 
} 
printf("%d%d%d%d%d%d%d%d",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]); 

}

+0

'массив [я]' всегда будет равен 'массив [я ++]'. Возможно, вы имели в виду 'array [++ i]'? –

+0

Получив обширный опыт Java, вы когда-нибудь делали отладку? –

ответ

3

Вы должны изменить следующий фрагмент кода из:

if (array[i]<=array[i++]) 
{ 
    storage = array[i]; 
    array[i]= array[i++]; 
    array[i++]= storage; 
} 

Для

if (array[i]<array[i+1])//++ is post increment operator and you are changing index value with every comparison and assignment 
{ 
    storage = array[i]; 
    array[i]= array[i+1]; 
    array[i+1]= storage; 
} 

Также причина бесконечного цикла заключается в том, что вы заменяете два элемента, которые вы не увеличиваете значение счетчика. Таким образом, вы должны удалить его из другой части и сделать ее обычной для цикла, независимо от того, переставляете ли вы два элемента или нет. Или у вас может быть while (counter != 0) {counter = 0; ...} Таким образом, это похоже на сортировку пузырьков.

+1

'array [i] <= array [i ++]' имеет неопределенное поведение. –

+0

в основном это означает 'array [i] <= array [i], тогда i = i + 1' так почему undefined? – SMA

+1

первый индекс 'i' это старый или новый? @almasshaikh –

0

переключатель это неправильно, если блок

if (array[i]<=array[i++]) 
{ 
    storage = array[i]; 
    array[i]= array[i++]; 
    array[i++]= storage; 
} 

этим блоком, если вы хотите приказ по возрастанию

if (array[i]>array[i+1]) 
{ 
    storage = array[i]; 
    array[i]= array[i+1]; 
    array[i+1]= storage; 
} 

или это ниже, если вы хотите порядке убывания (пожалуйста, обратите внимание, если условие)

if (array[i]<array[i+1]) 
{ 
    storage = array[i]; 
    array[i]= array[i+1]; 
    array[i+1]= storage; 
} 

и измените последнюю printf() для того, чтобы получить правильный и читаемый вывод, добавляя пробелы между целыми числами

printf("%d %d %d %d %d %d %d %d\n",array[0],array[1],array[2],array[3],array[4],array[5],array[6],array[7]); 
Смежные вопросы