java中合并排序的问题

java中合并排序的问题,java,mergesort,Java,Mergesort,我是stackoverflow的新手,我需要一些帮助来编写一个程序来合并排序可比较的arraylist。我已经在这个代码上工作了好几个小时,但没有结果。这个程序需要正确运行,因为我是为计算机科学课而做的,下一个作业要求我们测试不同种类的效率。代码如下: 合并方法: public static void merge(ArrayList <Comparable> a, int first, int mid, int last){ ArrayList <Comparable&

我是stackoverflow的新手,我需要一些帮助来编写一个程序来合并排序可比较的arraylist。我已经在这个代码上工作了好几个小时,但没有结果。这个程序需要正确运行,因为我是为计算机科学课而做的,下一个作业要求我们测试不同种类的效率。代码如下:

合并方法:

public static void merge(ArrayList <Comparable> a, int first, int mid, int last){
    ArrayList <Comparable> b = new ArrayList();
    for(int k = first; k <= last; k++){
        b.add(a.get(k));
    }

    System.out.println("b now contains " + b);
    int middle =b.size() /2;
    for(int i = first; i <= last; i++){
        //System.out.println("mid: " + b.size() /2);
        //System.out.println("b: " + b);
        //System.out.println("a: " + a);
        //System.out.println("i: " + i);
        if(middle == b.size()){
            a.set(i, b.remove(0));
            middle--;
        }else if(middle == 0){
            a.set(0, b.remove(0));
        }else if(b.get(0).compareTo(b.get(middle)) < 0){
            System.out.println("moving " + b.get(0) + " from b[0] to a[" + 
                i + "] because " + b.get(0) + " is less than " + b.get(middle));
            a.set(i, b.remove(0));
            middle--;
            System.out.println("b now contains " + b);
        }else{
            System.out.println("moving " + b.get(middle) + " from b[" + 
                b.size() /2 + "] to a[" + i + "] because " + b.get(0) + 
                    " is greater than " + b.get(middle));
            a.set(i, b.remove(middle));
            //middle--;
            System.out.println("b now contains " + b);
        }
    }

    System.out.println();
    System.out.println("Merge");
    System.out.println(a);
    System.out.println();
}

合并排序算法正常。我只是定义了ArrayList的类型以避免出现警告

   public static void mergeSort(ArrayList <Comparable> a, int first, int last){
        if(first < last){
            int mid = first + (last - first) /2;
        //    System.out.println("mergeSorting " + a.subList(first, mid ));
            System.out.println("First"+first);
            System.out.println("Mid"+mid);
            System.out.println("Last"+last);
            System.out.println("MergeSortCall");
            System.out.println("firstVector " + a.subList(first, mid+1));
            System.out.println("secondVector " + a.subList(mid + 1,last+1));                
            mergeSort(a, first, mid);
            mergeSort(a, mid + 1, last);
            merge(a, first, mid, last);
            System.out.println("mergeVector " + a.subList(first,last+1));
        }

    }
publicstaticvoidmergesort(arraylista,int-first,int-last){
如果(第一次<最后一次){
int mid=first+(last-first)/2;
//System.out.println(“合并排序”+a.subList(first,mid));
System.out.println(“第一”+第一);
系统输出打印项次(“Mid”+Mid);
System.out.println(“Last”+Last);
System.out.println(“MergeSortCall”);
System.out.println(“firstVector”+a.subList(first,mid+1));
System.out.println(“secondVector”+a.subList(mid+1,last+1));
合并排序(a、第一、中间);
合并排序(a,中间+1,最后);
合并(a、第一、中间、最后);
System.out.println(“mergeVector”+a.subList(first,last+1));
}
}
第二部分真的很难准确地知道什么是错误的,所以我用简单得多的符号替换了它。请注意,第二部分只是一个“合并”算法。它应该非常简单。无论如何,使用这个你可以和你的结果进行比较(对不起,很难理解第二部分的逻辑,这是你的家庭作业,不是吗?)。我使用了两个向量来提高可读性,但只需要一个向量

public static void merge(ArrayList <Comparable> a, int first, int mid, int last){
            ArrayList <Comparable> vectorFirst = new ArrayList<Comparable>();
            ArrayList <Comparable> vectorSecond = new ArrayList<Comparable>();

            for(int k=first;k<=mid;k++){
                vectorFirst.add(a.get(k));
            }
            for(int k=mid+1;k<=last;k++){
                vectorSecond.add(a.get(k));
            }

            int i=first;
            int j=mid+1;
            int k=first-1;
            while((i<=mid)&(j<=last)){
                if(vectorFirst.get(i-first).compareTo(vectorSecond.get(j-mid-1))==-1){
                    k=k+1;
                    a.set(k,vectorFirst.get(i-first));
                    i=i+1;
                }
                else{
                     k=k+1;
                     a.set(k,vectorSecond.get(j-mid-1));
                     j=j+1;
                }
            }
            if(i==mid+1){
                while(j<=last){
                    k=k+1;
                    a.set(k,vectorSecond.get(j-mid-1));
                    j=j+1;
                }
            }
            else{
                while(i<=mid){
                    k=k+1;
                    a.set(k,vectorFirst.get(i-first));
                    i=i+1;
                }
            }


        }
publicstaticvoidmerge(arraylista,int-first,int-mid,int-last){
ArrayList vectorFirst=新的ArrayList();
ArrayList vectorSecond=新的ArrayList();

对于(int k=first;kc你能给出一些你得到的具体错误的例子吗?合并方法似乎没有任何意义。你是从哪里得到这个想法的?你能用语言描述一下你试图在合并函数中做什么吗?根据代码,我怀疑你的想法是错误的。实际上不是合并两个单独的ArrayLists、 我将middle设置为一种分隔符。我的合并方法的思想是将b中的第一个元素或b后半部分的第一个元素写入a的第一个索引,并重复直到b为空。我本身没有收到任何错误,但它没有正确合并。您的输出中缺少一个值,对吗?我只想m请确保这不是一个输入错误:)@user3325257我已经放弃了使用“comparable”。现在我认为这是可以的。这里有一个版本的mergesort
   public static void mergeSort(ArrayList <Comparable> a, int first, int last){
        if(first < last){
            int mid = first + (last - first) /2;
        //    System.out.println("mergeSorting " + a.subList(first, mid ));
            System.out.println("First"+first);
            System.out.println("Mid"+mid);
            System.out.println("Last"+last);
            System.out.println("MergeSortCall");
            System.out.println("firstVector " + a.subList(first, mid+1));
            System.out.println("secondVector " + a.subList(mid + 1,last+1));                
            mergeSort(a, first, mid);
            mergeSort(a, mid + 1, last);
            merge(a, first, mid, last);
            System.out.println("mergeVector " + a.subList(first,last+1));
        }

    }
public static void merge(ArrayList <Comparable> a, int first, int mid, int last){
            ArrayList <Comparable> vectorFirst = new ArrayList<Comparable>();
            ArrayList <Comparable> vectorSecond = new ArrayList<Comparable>();

            for(int k=first;k<=mid;k++){
                vectorFirst.add(a.get(k));
            }
            for(int k=mid+1;k<=last;k++){
                vectorSecond.add(a.get(k));
            }

            int i=first;
            int j=mid+1;
            int k=first-1;
            while((i<=mid)&(j<=last)){
                if(vectorFirst.get(i-first).compareTo(vectorSecond.get(j-mid-1))==-1){
                    k=k+1;
                    a.set(k,vectorFirst.get(i-first));
                    i=i+1;
                }
                else{
                     k=k+1;
                     a.set(k,vectorSecond.get(j-mid-1));
                     j=j+1;
                }
            }
            if(i==mid+1){
                while(j<=last){
                    k=k+1;
                    a.set(k,vectorSecond.get(j-mid-1));
                    j=j+1;
                }
            }
            else{
                while(i<=mid){
                    k=k+1;
                    a.set(k,vectorFirst.get(i-first));
                    i=i+1;
                }
            }


        }