Сортировка вставками с использованием объектов, строк и списков массивов

У меня проблемы с кодом сортировки вставками.

public static ArrayList InsertionSort (ArrayList playerNames) {

    System.out.println("roster will now be sorted");

    for (int i = 1; i < playersNames.size();i++){

        int j = i - 1;
         Baller tempx = playersNames.get(i);
         Baller tempy = playersNames.get(j);
         while (j >= 0 &&  tempx.getName().compareToIgnoreCase(tempy.getName())< 0){
            playersNames.set(i, tempy);
            playersNames.set(j+1, tempx);
            j--;

         }


        System.out.println(playersNames);
    }

    return playersNames;
}

Вывод не выводится должным образом.


person user3670479    schedule 06.10.2014    source источник


Ответы (1)


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

Давайте посмотрим на эту часть кода:

     int j = i - 1;
     Baller tempx = playersNames.get(i);
     Baller tempy = playersNames.get(j);
     while (j >= 0 &&  tempx.getName().compareToIgnoreCase(tempy.getName())< 0){
        playersNames.set(i, tempy);
        playersNames.set(j+1, tempx);
        j--;

     }

Идея здесь состоит в том, чтобы неоднократно менять местами текущий элемент с предыдущим элементом, пока он не окажется в нужном месте. Это правильная идея, но есть небольшая ошибка: после замены tempy по-прежнему ссылается на элемент, который был в позиции playersNames.get(i - 1), поэтому следующая итерация цикла будет сравнивать не те два элемента. Кроме того, вы всегда выполняете обмен в позиции i (где начинается текущий элемент), но вы должны выполнять обмен в позиции j+1 (где в данный момент находится текущий элемент).

Чтобы изменить это, у вас есть несколько вариантов. Я думаю, что самым чистым вариантом было бы исключить переменные tempx и tempy, чтобы гарантировать, что вы не можете случайно совершить эту ошибку и вместо этого просто получить доступ к вещам по индексу. Например:

     int j = i - 1;
     while (j >= 0 &&
            playersNames.get(j).getName().compareToIgnoreCase(playersNames.get(j+1).getName().getName()) < 0){
        Baller temp = playersNames.get(j);
        playersNames.set(j, playersNames.get(j+1));
        playersNames.set(j+1, temp);
        j--;
     }
person templatetypedef    schedule 27.08.2015