Почему пузьковая сортировка идет не до конца?

244
25 сентября 2017, 01:36

Есть массив из 4 элементов.Делаю пузырькову сортировку но последний шаг он не делает. Вот код

public class JavaApplication3 {
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
      int []a = new int[10];
       a[0]=18;
       a[1]=7;
       a[2]=62;
       a[3]=1;
      SOrting sOrting = new SOrting();
      for (int i = 0;i<4;i++){
          System.out.print("Before srotnig " + a[i] + " ");
      }
      sOrting.bubbleSort(a);
        for (int i = 0;i<4;i++){
          System.out.print("  After srotnig " + a[i] + " ");
      }
    }

//--------------------------------------------------------------
}

Вот класс сортировки

public class SOrting {
       public  void  bubbleSort(int a[]) {
        int out, in;
        int nElems=4;
        for (out = nElems - 1; out > 1; out--) // Внешний цикл (обратный)
        {
            for (in = 0; in < out; in++) // Внутренний цикл (прямой)
            {
                if (a[in] > a[in + 1]) // Порядок нарушен?
                {
                    swap(in, in + 1,a); // Поменять местами
                }
            }
        }
    }
//--------------------------------------------------------------
    private void swap(int one, int two,int a[]) {
        long temp = a[one];
        a[one] = a[two];
        a[two] = (int) temp;
    }

}

Вот что получаю на выходе ДО сортировки

18 7 62 1 

после сортировки

 7 1 18 62

почему 7 и 1 не меняются местами???я сделал все поформуле книжки . если сделать out>0 тогда будет 1 7 Но это неправильно у меня 4 элемента.ПОчему так ?

Answer 1

Дело в том, что ваш внешний цикл заканчивается раньше, чем отсортирует элементы "1" и "7". Измените условие внешнего цикла в вашем классе сортировки на следующее : (out = nElems - 1; out > 0; out--)

public class SOrting {
       public  void  bubbleSort(int a[]) {
        int out, in;
        int nElems=4;
        for (out = nElems - 1; out > 0; out--) // Внешний цикл (обратный)
        {
            for (in = 0; in < out; in++) // Внутренний цикл (прямой)
            {
                if (a[in] > a[in + 1]) // Порядок нарушен?
                {
                    swap(in, in + 1,a); // Поменять местами
                }
            }
        }
    }
//--------------------------------------------------------------
    private void swap(int one, int two,int a[]) {
        long temp = a[one];
        a[one] = a[two];
        a[two] = (int) temp;
    }

}
READ ALSO
Как удалить одинаковые буквы из строки? - Java SE

Как удалить одинаковые буквы из строки? - Java SE

Возник вопрос: Как удалить одинаковые буквы из строки? Есть вот это:

383
Наглядный пример различия DTO, POCO (POJO) и Value Object

Наглядный пример различия DTO, POCO (POJO) и Value Object

Навеяно статьёй о различиях DTO, POCO и Value Object на Хабрахабре: DTO vs POCO vs Value Object, а также вопросом POCO vs DTO

295
Как открыть файл из директории assets

Как открыть файл из директории assets

Хочу передать файл soundmp3 на сервер

321
Чем отличается колбэк от слушателя?

Чем отличается колбэк от слушателя?

Например, чтобы обработать нажатие на Button необходимо воспользоваться методом setOnClickListener передав оному OnClickListener (слушатель)И такой Listener много...

240