У меня необычная проблема. Я реализовал сортировку слиянием и столкнулся со следующим: метод работает правильно, за исключением последнего прохода. При наличии случайного массива Integer
в качестве входных данных возвращается массив Integer
, в котором первая половина и вторая половина сортируются отдельно. Слияние работает правильно, за исключением последнего прохода. После нескольких часов возни с отладчиком я понял, что «точка упоминания» всегда оценивается как false
на последнем проходе, хотя это не должно основываться на значениях.
Вся помощь приветствуется.
public static Integer[] mergeSort(Integer[] input)
{
if (input.length == 1) return input;
int splittle = input.length / 2;
Integer[] first = new Integer[splittle];
Integer[] second = new Integer[input.length - splittle];
for (int i = 0; i < splittle; i++)
first[i] = input[i];
for (int i = splittle; i < input.length; i++)
second[i - splittle] = input[i];
mergeSort(first);
mergeSort(second);
LinkedList<Integer> returner = new LinkedList<Integer>();
PriorityQueue<Integer> sFirst = new PriorityQueue<Integer>();
PriorityQueue<Integer> sSecond = new PriorityQueue<Integer>();
for (int i = 0; i < first.length; i++)
sFirst.offer(first[i]);
for (int i = 0; i < second.length; i++)
sSecond.offer(second[i]);
// while (!sFirst.isEmpty()&&!sSecond.isEmpty())
// returner.add((sFirst.peek()>=sSecond.peek() ?
// sFirst.poll():sSecond.poll()));
// expansion of line above for debugging purposes
while (!sFirst.isEmpty() && !sSecond.isEmpty())
{
int temp = 0;
if (sFirst.peek() >= sSecond.peek())
temp = sFirst.poll(); // Mention point
else
temp = sSecond.poll();
returner.add(temp);
}
while (!sFirst.isEmpty())
returner.add(sFirst.poll());
while (!sSecond.isEmpty())
returner.add(sSecond.poll());
return returner.toArray(new Integer[0]);
}
int[]
и позволить Java заниматься автоупаковкой, когда придет время использоватьLinkedList
иPriorityQueue
. - person Matt Ball   schedule 12.05.2011