Если вы «подозреваете», что что-то является проблемой, то ваше первое действие должно состоять в том, чтобы выяснить, так ли это или нет.Профилируйте код.Тогда вы будете знать, где медленные биты.Вы можете сделать это с помощью инструмента профилирования или просто бросив вызовы System.nanoTime () в ключевые моменты и сохранив некоторые итоги.Сделайте это прежде, чем выполнять какую-либо оптимизацию!
Теперь, интересная вещь о массиве, который вы сортируете, в том, что он обычно «в основном отсортирован».Первые 90% из них - это выжившие из предыдущего раунда, которые отсортированы.Вы можете использовать это в своих интересах, используя адаптивную сортировку , которая меньше работает с такими в основном отсортированными массивами.Существует несколько известных адаптивных сортов, но хорошим универсальным является Timsort .Это на самом деле станет стандартной сортировкой в Java 7 - сноски к статье в Википедии об этом содержат ссылку на код в OpenJDK, который будет использоваться, который вы можете просто украсть.
Даже лучше, чем применять адаптивныйСортировка состояла бы в том, чтобы сначала отсортировать новых детей (используя адаптивную сортировку, так как вы сначала выводите наиболее подходящих родителей и, следовательно, ожидаете, что сначала появятся наиболее подходящие дети), а затем объединить их в уже отсортированные.список родителей.Вы можете объединить их сразу за O (n), пройдя параллельно родительский и дочерний массивы и вставив дочерние массивы, где это необходимо.Вы можете посмотреть на использование LinkedList здесь, так как в противном случае вы могли бы потратить много времени в System.arrayCopy ().
Кроме того, в getBreedingArray () вы говорите breedingArray.contains(i)
- для массива,это операция O (n).Вы, вероятно, должны использовать LinkedHashSet вместо массива здесь.Поцарапайте это - используйте BitSet.