Прежде всего, спасибо за ответы.Они указали мне на правильное решение.Я проголосовал за них, чтобы отдать должное, но, поскольку мне удалось решить этот вопрос, я приму свой собственный ответ (по крайней мере, пока не придет лучший).
Итак, прежде всего, домашняя работа была о "Такси "(вы знаете, как домашняя работа ...) и TaxiQueue на Java.
Решение было:
public void sort() {
sort(this);
}
private void sort(TaxiQueue toSort) {
// Prepare split parts for later merging
TaxiQueue m1 = new TaxiQueue(), m2 = new TaxiQueue();
// Return if there's only 1 element in the queue
// since it's essentially "sorted".
if(singleItem(toSort))
return;
// Split toSort into 2 parts
split(toSort, m1, m2);
// Sort each part recursively (by splitting and merging)
sort(m1);
sort(m2);
// Merge each part into 1 sorted queue
merge(toSort, m1, m2);
}
private boolean singleItem(TaxiQueue tq) {
Taxi temp = tq.dequeue();
boolean retVal = tq.empty();
tq.enqueue(temp);
return retVal;
}
private void merge(TaxiQueue toSort, TaxiQueue m1, TaxiQueue m2) {
// Notice that m1 and m2 are already sorted, and now we need
// to merge them.
// In the case that one of them is empty and the other one isn't,
// simply append all remaining "higher" values into toSort.
if(m1.empty()) {
appendQueue(m2, toSort);
return;
}
else if (m2.empty()) {
appendQueue(m1, toSort);
return;
}
// The critical comparison part...
if(m1.peek().getId() < m2.peek().getId())
toSort.enqueue(m1.dequeue());
else
toSort.enqueue(m2.dequeue());
// Continue merging elements into toSort.
merge(toSort, m1, m2);
}
// Split toSort into m1 and m2 as equally as possible
private void split(TaxiQueue toSort, TaxiQueue m1, TaxiQueue m2) {
if(toSort.empty())
return;
m1.enqueue(toSort.dequeue());
split(toSort, m2, m1);
}
// Enqueue everything in src to dest.
private void appendQueue(TaxiQueue src, TaxiQueue dest) {
if (src.empty())
return;
dest.enqueue(src.dequeue());
appendQueue(src, dest);
}
Я надеюсь, что другие студенты могут найти это полезным в один прекрасный день!