Java:将列表分成" Chunks"已排序,完全排序列表

时间:2016-10-13 03:59:47

标签: java arrays list mergesort

好的,首先发布在这里,所以请耐心等待。

所以我尽可能地尝试自己解决这个问题,但我在这里有点亏。我已经获得了一个12个整数的列表(并将给出更多的测试,但我将使用这个测试)。清单如下:

18 21 9 12 99 4 101 8 14 7 112 98

并且块被定义为已经排序的整数分组。这意味着有6个块。由于这是一个递归的块合并排序,我需要能够根据块分解它。

第一次拆分看起来像:

18 21 9 12 99 4 101 | 8 14 7 112 98

,第二个看起来像:

18 21 | 9 12 99 | 4 101 ||| 8 14 | 7 112 | 98

如您所见,这意味着六个块。现在,我已经设法进入第一步,但它不是通过递归或通过这些块来完成的。我作弊并采取了名单的大小,并把它削减了一半。那是不行的。

我愿意尝试任何建议,我只是想知道如何将其分解成这些块,特别是如果我不能决定"块的数量"进去。

这是我的一大块代码,如果有帮助的话:

    public List<Integer> chunkMergesort(List<Integer> S) {
    int c = 0;

    if(S.size() > 1){
        c = 1;
        for(int i = 0; i<S.size()-1 ; i++){
            if(S.get(i+1)< S.get(i)){
                c++;
                System.out.println("C is: " + c);
            }
        }
        System.out.println("Final C is: " + c);
        chunkDivide(S, c);
    }
        return S;
}

public Chunks chunkDivide(List<Integer> S, int c) {

    int Ssize = S.size()/2;
    System.out.println("List:"+ S);

    List<Integer> S1 = new ArrayList<Integer>();
    List<Integer> S2 = new ArrayList<Integer>();

    for(int i = 0; i < Ssize; i++){
        //System.out.println("i is: "+ i);
        S1.add(i, S.get(i));    
        System.out.println("S1 is:"+ S1);
    }

    for(int i = Ssize; i < S.size(); i++){
        S2.add(i-Ssize, S.get(i));
        System.out.println("S2 is:"+ S2);

    }

    System.out.println("S1 is: "+ S1);
    System.out.println("S2 is: "+ S2);      

    Chunks p = new Chunks(S1, S2);

    //chunkMergesort(S1);
    //chunkMergesort(S2);
    //chunkDivide(p.right, mid);
    //chunkDivide(p.left, mid);

    merge(S1,S2);

    return p;

提前致谢!

编辑:

我最终使用类似于@Eritrean所建议的东西,但出现了一个全新的问题。我的列表被移动到一个块列表中,但列表中的最后一项(98)也应该是最后一个块,它会被删除。我试图询问如何在另一个问题中解决这个问题,并立即被解雇,因为它是重复的。那些&#34;答案&#34;实际上并没有回答我的问题。对此更深入了解将是非常好的。

下面是显示输出的图像。 CMD Snip

1 个答案:

答案 0 :(得分:0)

您可以遍历列表并通过比较当前元素及其后继元素来查找列表的已排序部分。然后,您可以使用方法list.subList(int fromIndex,int toIndex)将此部件添加到列表列表中。例如:

NULL