Java 递归地将2个“虚拟列表”合并为一个
在你阅读问题之前:不,我不是想让你为我写代码,我只是想要一些提示 我写的合并排序算法有问题。代码的规范规定我只能使用一个ArrayList进行合并。例如: 使用[5,1,3,9,2]的ArrayList,我会递归地将列表拆分为 [5,1,3]和[9,2] 我会将这些子列表再次拆分为: [5,1]和[3]——以及[9]和[2]; 现在,我将arrayList[5,1]排序为[1,5],然后我将得到一个包含数字的完整数组: [1, 5, 3, 9, 2] 记住,在这一点上,我没有创建任何新的ArrayList,我只是在我拥有的小的子列表中进行排序。因此,回到递归,我将把列表[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的情况下切换索引 这是我目前掌握的代码:Java 递归地将2个“虚拟列表”合并为一个,java,sorting,recursion,arraylist,merge,Java,Sorting,Recursion,Arraylist,Merge,在你阅读问题之前:不,我不是想让你为我写代码,我只是想要一些提示 我写的合并排序算法有问题。代码的规范规定我只能使用一个ArrayList进行合并。例如: 使用[5,1,3,9,2]的ArrayList,我会递归地将列表拆分为 [5,1,3]和[9,2] 我会将这些子列表再次拆分为: [5,1]和[3]——以及[9]和[2]; 现在,我将arrayList[5,1]排序为[1,5],然后我将得到一个包含数字的完整数组: [1, 5, 3, 9, 2] 记住,在这一点上,我没有创建任何新的Arra
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++;
}
}
另外,我用不同的方法解决了这个实验室,但不是用合并的方法:
对于每个子列表,我使用insertionSort对其进行了遍历,以对两个子列表进行排序,但这并不是合并的真正含义:但是,对于该方法,我的代码如下所示:
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);
}
也许会有帮助。嘿!谢谢你的意见!然而,该链接唯一的问题是,此人创建了一个新数组来存储此行的信息:int[]a=newint[totElem];对不起,你的问题漏掉了。试试看,再次感谢你的帮助!我在这里还找到了一个更好的链接供将来参考:System没有ArrayList替代品,这有点糟糕。arraycopy: