Этот метод BubbleSort может быть оптимизированным еще больше?

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

До настоящего времени мое временное решение:

public void burbuja(){
    String TipoOrdenamiento= "Max";
    int i,j,aux;



    for(i=1;i<A.length;i++){
        for(j=A.length-1; j>=i; j--){

            if(TipoOrdenamiento=="Min"){
                if(A[j-1] >A [j]){
                    aux= A[j-1];
                    A[j-1]= A[j];
                    A[j]= aux;
                }
            }
            if(TipoOrdenamiento=="Max"){
                if(A[j-1] <A [j]){
                    aux= A[j-1];
                    A[j-1]= A[j];
                    A[j]= aux;
                }
            }
        }
    }
}   

Поскольку они увидят различие между восходящим распоряжением, и нисходящий один очень маленький. Мой вопрос, - если этот метод уже был уменьшен до Вашей простейшей формы, или Вы считаете, что у этого кода все еще есть край, чтобы продолжать быть compactado. Того, чтобы быть таким: какого способа могло бы находиться лучшее решение? (лучшее решение в условиях минимального количества "клонировавшего" кода).

1
задан 01.10.2016, 10:09
2 ответа

Есть несколько точек из-за того, что улучшается (первые 2, уже упомянутые из-за @Dev. Джоэл):

  1. Сравнение цепей - посредством equals, не с ==.
  2. Договоренность, которую нужно упорядочивать, и тип распоряжения должны бы быть параметрами.
  3. Если не будет показан тип соответствующего распоряжения, не осуществится никакое действие.
  4. Должны быть санкционированными аргументы в начале, чтобы предотвращать проблемы в выполнении метода: переменные, которые не являлись недействительными, и т.д.
  5. Типы распоряжения должны бы быть оцененными строчными буквами или прописными буквами, чтобы предотвращать проблемы, как "MIN" посылать "mIn", "min", и т.д.
  6. Стратегия сравнения может быть оцененной единственный раз и оставшаяся часть кода пребывать равным.
  7. То, что ты осуществляешь, так это самая неэффективная форма алгоритма пузырька воздуха. Например, если бы договоренность, которую он было нужно упорядочивать уже, была упорядочена, тогда равный реализует NxN повторения, где N - длина договоренности. Более соответствующее осуществление проверяет, если в течение выполнения было какое-то изменение, так что он был бы должен продолжать пробовать упорядочивать договоренность, и если не было изменений тогда, договоренность уже является аккуратной.

Я буду поставлять осуществление, основанное на твоем коде и предложенный прогресс, включая благодеяние, Java использует 8:

static final String TIPO_ORDEN_MIN = "min";

//punto 2
public void burbuja(int[] A, String tipoOrdenamiento) {
    //punto 4
    if (A == null) return; //no hacer nada porque el arreglo es nulo
    //punto 5
    tipoOrdenamiento = tipoOrdenamiento == null ? "" : tipoOrdenamiento.trim().toLowerCase(); //
    //punto 5
    //por defecto, que ordene de menor a mayor
    BiPredicate<Integer, Integer> comparadorOrden = (x, y) -> x > y;
    //puntos 1 y 3
    //extra: usualmente los valores que sabemos que no van a variar
    //deben declararse como constantes como es el caso de
    //la variable TIPO_ORDEN_MIN
    //y siempre se deben comparar las constantes contra las variables
    //no al revés
    if (TIPO_ORDEN_MIN.equals(tipoOrdenamiento)) {
        comparadorOrden = (x, y) -> x < y;
    }
    //variable para limitar la cantidad de iteraciones (punto 7)
    boolean cambio = true;
    for (i = 1; cambio && i < A.length; i++) {
        //por defecto, asumimos que no habrán cambios en esta iteración
        cambio = false;
        for (j = A.length-1; j >= i; j--) {
            if (comparadorOrden.test(A[j-1, j], A[j])) {
                int aux = A[j-1];
                A[j-1] = A[j];
                A[j] = aux;
                //si hubo un cambio, actualizar la variable
                cambio = true;
            }
        }
    }
}
1
ответ дан 24.11.2019, 13:14

Какие-то вопросы, чтобы изменять в Вашей программе

  • Сравнивать Strings с equals(); не с ==

    if(TipoOrdenamiento.toLowerCase().equals("min")){...}
    if(TipoOrdenamiento.toLowerCase().equals("max")){...}
    
  • Тип Распоряжения может проходить по параметру в метод

    public void burbuja(String TipoOrdenamiento){...}
    
0
ответ дан 24.11.2019, 13:14