在您阅读问题之前:不,我不是想让您为我编写代码,我只是想要一些指示
我写的是MergeSort算法的问题。代码的规范说明我只能使用ONE ArrayList进行合并。例如:
使用[5,1,3,9,2]的ArrayList,我会递归地将列表拆分为
现在,我将arrayList [5,1]排序为[1,5],然后我将有一个包含数字的整个数组:
请记住,此时,我还没有创建任何新的ArrayLists,我刚刚在我的小子列表中进行了排序。所以,回到递归,然后我将列表与[1,5]合并到列表[3]。现在,我如何在不创建全新的ArrayList来存储临时信息的情况下做类似的事情呢?
无论如何,一旦我[1,3,5,9,2],我就会整理出第二个子列表,[9,2],得到[1,3,5,2,9]。然后我需要“虚拟”合并[1,3,5]和[2,9]来获得[1,2,3,5,9]。我将如何“虚拟地”合并这些列表(实质上,无需创建新的ArrayList就可以移动索引)。
这是我到目前为止的代码:
int counterFromStart = first;
int counterFromMid = mid + 1;
while (counterFromStart < counterFromMid && (counterFromMid <= last)){
if (a.get(counterFromStart).compareTo(a.get(counterFromMid)) > 0){
Comparable temp = a.get(counterFromStart);
a.set(counterFromStart, a.get(counterFromMid));
a.set(counterFromMid, temp);
counterFromMid++;
} else {
counterFromStart++;
}
}
另外,我以不同的方式解决了这个实验,但没有采用合并的方法:
对于每个子列表,我使用insertSort对它进行了排序,以对两个子列表进行排序,但同样,这不是“合并”的真正原因:我的代码对于该方法如下:
for (int outer = first + 1; outer <= last; outer++){
int positionInSubList = outer;
Comparable insertObject = a.get(positionInSubList);
while (positionInSubList > 0 && a.get(positionInSubList - 1).compareTo(insertObject) > 0){
a.set(positionInSubList, a.get(positionInSubList - 1));
positionInSubList--;
}
a.set(positionInSubList, insertObject);
}