2016-08-30 2 views
-1

Я столкнулся с очень запутанной ситуацией, я написал эту программу BubbleSort, и она прошла нормально. с правильным выходом:Bubble Сортировка Java различных выходов

public class BubbleSortInput { 

private static void Sorting(int[] intArray) 
{ 
    int i, temp=0; 
    int n = intArray.length; 

    for(i=0; i < n - 1; i++) 
    { 
     for(int j = 0; j < n-i-1; j++) 
     { 
      if(intArray[i]>intArray[i+1]) 
      { 
       temp = intArray[i+1]; 
       intArray[i] = intArray[i+1]; 
       intArray[i] = temp; 
      } 
     } 
    } 
} 

public static void main(String[] args) { 

    int array[] = {1,5,65,34,76,234}; 

    Sorting(array); 
    for(int k = 0; k < array.length; k++) 
    { 
     System.out.println(array[k]); 
    } 
} 
} 

Однако я пытался писать в основном один и тот же код, в основном методе, в другом классе:

class BubbleSort { 
public static void main(String[] args) { 
    int numbers[] = {12,43,65,12,65,92,32,54}; 
    int i,temp=0; 

    for(i=0; i < numbers.length-1; i++) 
    { 
     for(int j = 0; j < numbers.length-i-1; j++) 
     { 
      if(numbers[i]>numbers[i+1]) 
      { 
       temp = numbers[i+1]; 
       numbers[i] = numbers[i+1]; 
       numbers[i]= temp; 
      } 
     } 
    } 

    for(i=0;i<numbers.length;i++) 
    { 
     System.out.println(numbers[i]); 
    } 
} 
} 

Выход я на второй файл совершенно неправильно , хотя я использовал почти тот же код, может кто-нибудь объяснить это, пожалуйста?

Output: 

12 
43 
12 
12 
65 
32 
32 
54 
+1

Вы пробовали отлаживать код? См. [Что такое отладчик и как он может помочь мне диагностировать проблемы?] (Http://stackoverflow.com/q/25385173/5221149) – Andreas

+0

Внутренний цикл должен использовать «j» как индекс, а не «i» – sprinter

+0

I не вижу, как любой из них может работать, учитывая, что 'intArray [i] = intArray [i + 1]' и 'numbers [i] = numbers [i + 1]' оба присваивают неправильный путь. – Andreas

ответ

0

Как указывалось другими, вы должны взглянуть на алгоритм сортировки пузырьков. И просто напоминание, запустите множество тестовых примеров, прежде чем заявить, что ваша оригинальная часть кода работает нормально. Чтобы быть понятным, первая программа также дает неверный результат. Результат, который вы, возможно, получили для вашего набора входных данных, может быть правдой, но это было немного отсортировано для начала. Попробуйте ввести набор ввода, который вы использовали во второй программе для своего первого кода, и определите ошибки. Кроме того, взгляните на код обмена внутри ваших циклов for.

   temp = intArray[i+1]; 
       intArray[i] = intArray[i+1]; 
       intArray[i] = temp; 

Вы назначаете значение в положении [i + 1] на значение temp. И вы снова присваиваете значение в [i + 1] местоположению i. Таким образом, значение в местоположении [i] было потеряно в процессе. Теперь значение в местоположении [i] и [i + 1] одинаково. Так что работайте над этим.

Это в сторону. В сортировке Bubble сортировка выполняется путем замены соседних элементов. Таким образом, к концу первого прохода (сортировка по возрастанию) наибольший элемент в массиве будет в конце. Этот процесс продолжается до тех пор, пока все элементы не будут отсортированы.

Example: 
First Pass: 
(6 1 3 2 9) –> (1 6 3 2 9), Here, algorithm compares the first two elements, and swaps since 6 > 1. 
(1 6 3 2 9) –> (1 3 6 2 9), Swap since 6 > 3 
(1 3 6 2 9) –> (1 3 2 6 9), Swap since 6 > 2 
(1 3 2 6 9) –> (1 4 2 5 8), Now, since these elements are already in order (9 > 6), algorithm does not swap them. 
Second Pass: 
(1 3 2 6 9) –> (1 3 2 6 9) 
(1 3 2 6 9) –> (1 3 4 6 9), Swap since 3 > 2 
(1 2 3 5 9) –> (1 2 3 5 9) 
(1 2 3 5 9) –> (1 2 3 5 9) 
Now, the array is already sorted, but our algorithm does not know if it is completed. The algorithm needs one whole pass without any swap to know it is sorted. 
Third Pass: 
(1 2 3 5 9) –> (1 2 3 5 9) 
(1 2 3 5 9) –> (1 2 3 5 9) 
(1 2 3 5 9) –> (1 2 3 5 9) 
(1 2 3 5 9) –> (1 2 3 5 9) 
+0

Спасибо, Говинд, очень полезно! – rookie101

+0

@ rookie101 Если вы нашли ответ подходящим и правильным, нажмите на значок «tick» рядом с моим сообщением. Cheers –

0

Я не думаю, что ваш код сортировки пузыря правильный. Вот ваша петля:

for(i=0; i < n - 1; i++) 
{ 
    for(int j = 0; j < n-i-1; j++) 
    { 
     if(intArray[i]>intArray[i+1]) 
     { 
      temp = intArray[i+1]; 
      intArray[i] = intArray[i+1]; 
      intArray[i] = temp; 
     } 
    } 
} 

Обратите внимание, что вы никогда не используете переменную j. Таким образом, все, что он делает, - это цикл через массив, а затем заменяет два элемента, если первый из них больше второго. Вы должны снова взглянуть на алгоритм сортировки Bubble и перезаписать свой код.

+1

Также обратите внимание, как 'intArray [i] = intArray [i + 1] 'назначает неправильный путь для операции свопинга. – Andreas

0

Используемая вами логика сортировки неверна.

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

Посетите http://visualgo.net/sorting для лучшего понимания.

Итак, в вашем коде вы должны сравнить элементы со второй инициализацией (переменная j в вашем случае). После изменения он должен выглядеть так:

for(i=0; i < n - 1; i++) 
{ 
    for(int j = 0; j < (n-i)-1; j++) 
    { 
     if(intArray[j]>intArray[j+1]) 
     { 
      temp = intArray[j]; 
      intArray[j] = intArray[j+1]; 
      intArray[j+1] = temp; 
     } 
    } 
} 
+0

Спасибо, это действительно помогло мне понять весь процесс – rookie101

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