Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 递归地将2个“虚拟列表”合并为一个_Java_Sorting_Recursion_Arraylist_Merge - Fatal编程技术网

Java 递归地将2个“虚拟列表”合并为一个

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

在你阅读问题之前:不,我不是想让你为我写代码,我只是想要一些提示

我写的合并排序算法有问题。代码的规范规定我只能使用一个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的情况下切换索引

这是我目前掌握的代码:

    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: