2015-05-03 7 views
-4

Я пытаюсь реализовать сортировку пузырьков, но в конце список не сортируется вообще.Bubble Сортировка не сортировка

Похоже, что это, и я не могу найти ошибку:

void sort(int values[], int n) 
{ 
    //Printing unsorted list 
    for(int l = 0; l < n; l++) 
    { 
     printf("Unsorted %i \n", values[l]); 
    } 

    // Implement Bubble sort 
    for(int j = 0; j <= n-1; j++) 
    { 
     int swaps = 0; 
     int k = 0; 
     for(int i = 0; i < n - k; i++) 
     { 
      if(values[i] > values[i+1]) 
      { 
       swap(&values[i], &values[i+1]); 
       swaps++; 
       printf("swaps: %i\n", swaps); 
       //Printing sorted list 
       for(int m = 0; m < n; m++) 
       { 
        printf("Sorted %i \n", values[m]); 
       } 
      } 

      if(swaps == 0) 
      { 
       return; 
      } 

      k++; 
     } 
    } 
} 

неотсортированной список является:

Unsorted 34 
Unsorted 17 
Unsorted 51 
Unsorted 12 
Unsorted 33 
Unsorted 56 
Unsorted 11 
Unsorted 31 
Unsorted 16 
Unsorted 55 

И отсортированный список выходит так:

Sorted 17 
Sorted 34 
Sorted 12 
Sorted 33 
Sorted 51 
Sorted 56 
Sorted 11 
Sorted 31 
Sorted 16 
Sorted 55 

PS: Функция подкачки работает, я ее уже тестировал.

+3

Вы должны пройти через функцию самостоятельно, по очереди; ошибка легко обнаружить, если вы знаете понятие пузырьковой сортировки. –

+0

Некоторые люди просто не хотят помогать. Если бы я мог найти ошибку самостоятельно, с отладчиком или просто взглянув на нее, я бы НЕ разместил здесь –

+0

@JoaoTurolla Некоторые люди не хотят работать, потому что это совпадение легче спросить, а не отлаживать самостоятельно. Проблема в том, что вы учитесь программировать только тогда, когда работаете, а не когда получаете ответы от кого-то еще. – Slava

ответ

2

Основная проблема, которую я вижу с кодом в

for(int i = 0; i < n - k; i++) 
    { 
     if(values[i] > values[i+1]) 
     { 
      swap(&values[i], &values[i+1]); 
      swaps++; 
      printf("swaps: %i\n", swaps); 
      //Printing sorted list 
      for(int m = 0; m < n; m++) 
      { 
       printf("Sorted %i \n", values[m]); 
      } 
     } 
     if(swaps == 0) 
     { 
      return; 
     } 

     k++; 
    } 

Вы печатаете все значения внутри if заявление, что неправильно. И, если первое значение не будет заменено, функция вернется без каких-либо действий.

Возможное решение было бы

int swaps = 0; 
    for(int j = 0; j < n - 1; j++) 
    { 
    for(int i = 0; i < n - 1 ; i++) 
    { 
     if(values[i] > values[i+1]) 
     { 
      swap(&values[i], &values[i+1]); 
      swaps++; 
     } 
    } 
    if(swaps == 0) 
    { 
     break; 
    } 
    } 
    printf("swaps: %i\n", swaps); 
    if(swaps == 0) 
    { 
    return; 
    } 
    //Printing sorted list 
    for(int m = 0; m < n; m++) 
    { 
     printf("Sorted %i \n", values[m]); 
    } 
+0

Да, я печатал не в том месте. Но, я не понял, почему вы положили 'if (swaps == 0) { return; } ' за пределами первого цикла (один с J). Потому что я установил мой в первом цикле и за пределами второго и, похоже, работает –

+0

@JoaoTurolla, да, вы правы там, потому что, если в первой итерации цикла for нет «sw», вместо j, нет необходимости проверять остальную часть. Я на самом деле не компилировал это и не написал его, посмотрев на проблемы, которые я видел (я упомянул, что это вероятное решение, не означает, что оно является самым эффективным), и именно поэтому я это пропустил. Но теперь я скомпилировал его, а также увлекаюсь ошибкой с 'k', вам не нужно' k', это не будет работать для особых случаев, поэтому я удалил его. Посмотрите на обновленный ответ. –

1

HINT , этот цикл все еще не работает. Рассмотрим набор {17, 40, 39, 41}. Для первого элемента не было обменов, но оно все еще не сортировано.

0

я думать есть проблемы во втором контуре

SOLN

int temp; 
for(int j = 0; j <= n-1; j++) 
{ 
    int swaps = 0; 
    int k = 0; 
    for(int i = 0; i < n - j; i++) 
    { 
     if(values[i] > values[i+1]) 
     { 
      temp=values[i]; 
      values[i]=values[i+1]; 
      values[i+1]=temp; 
      swaps++; 
      cout<<"swaps:"<<swaps<<"\n"; 

     } 




    } 
} 
for(int m = 0; m < n; m++) 
      { 
       cout<<"Sorted "<<values[m]<<"\n"; 
      } 

, а также, если первый не будет меньше, чем вторая переменная подкачка определяется как нуль и выход программы

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