首先,感谢您的回答。他们为我指出了正确的解决方案。我投票给他们以表扬他们,但既然我设法解决了这个问题,我会接受我自己的答案(至少在更好的答案出现之前)。
所以首先,作业是关于“出租车”(你知道作业是怎样的......)和 Java 中的 TaxiQueue。
解决办法是:
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);
}
我希望其他学生有一天会发现它有用!