2014-09-21 7 views
0

Я создал функцию сортировки пузырьков массива для целых чисел, которая отлично работает с положительными целыми числами, но сработает, когда используются отрицательные целые числа. Начальная функция отображения работает, но затем она просто зависает. Я пробовал подписанный массив int безрезультатно.C++ Bubble Сортировать отрицательные числа

Я просмотрел все, но не могу найти кого-либо еще с этой точной проблемой.

int defaultArray[6] = { 12, -5, 21, -1, 15, 17 }; 
    int numElements = 6; 

    int lastSwap; 
    int searchEnd = numElements - 1; 
    bool sorted = false; 

    while (!sorted) 
    { 
     for (int i = 0; i < searchEnd; ++i) 
     { 
      // If the number in position i is larger than the number in the 
      // position i + 1 then swap them 

      if (defaultArray[i] > defaultArray[i + 1]) { 
       int temp = defaultArray[i]; 
       defaultArray[i] = defaultArray[i + 1]; 
       defaultArray[i + 1] = temp; 
       lastSwap = i + 1; 
      } 
     } 

     // If the lastSwap is at position one we can conclude that the array is 
     // sorted so if lastSwap isn't 1 move searchEnd and continue 
     if (lastSwap != 1) 
     { 
      // Conclude that from lastSwap to the end of the array is sorted 
      // searchEnd begins one position to the left of lastSwap 
      searchEnd = lastSwap - 1; 
     } 
     else { 
      sorted = true; 
     } 
+1

Вы как бы забыли описать проблему. Вы просто говорите, что «перестает работать». Но что это значит? Это крушение? Это замкнуто навсегда? Производит ли он неправильные результаты? –

+0

У вас нет всего вашего кода здесь. Где вы изначально устанавливаете 'lastSwap' и где вы устанавливаете его в своем (внешнем) цикле? –

+0

с одной стороны, если ваш массив начинает сортироваться, lastSwap остается неопределенным, и так будет searchEnd. – dhavenith

ответ

1

Вы пытаетесь оптимизировать алгоритм убывающую searchEnd, и я думаю, что есть проблема. Я рекомендую вам сохранить searchEnd. Чтобы определить, отсортирован ли массив, установите sorted в значение true и начало цикла while и измените его на false, если произойдет обмен. Например:

while (!sorted) { 
    sorted = true; 
    for (int i = 0; i < searchEnd; ++i) { 
     if (defaultArray[i] > defaultArray[i + 1]) { 
      // swap 
      sorted = false; 
     } 
    } 
} 
+0

Даже когда я ушел в оптимизацию, которая сработала. Я до сих пор не могу понять, почему он терпит крах, но спасибо. –

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