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

时间:2014-01-15 02:23:01

标签: java sorting recursion arraylist merge

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

我写的是MergeSort算法的问题。代码的规范说明我只能使用ONE 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]

请记住,此时,我还没有创建任何新的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);
    }

0 个答案:

没有答案