【问题标题】:Java Recursive Merge SortJava递归合并排序
【发布时间】:2015-05-02 02:31:43
【问题描述】:

目前对我的递归合并排序程序感到震惊,我一直在寻找问题所在,但似乎找不到。

package mergesort;

import java.util.ArrayList;

public class MergeSort {

public MergeSort() {
    // TODO Auto-generated constructor stub
}

public static <T extends Comparable<? super T>> void mergesort(T[] list, int n)
{
    mergeSort(list,0,n-1);
}

static <T extends Comparable<? super T>> 
void mergeSort(T[] tempArray, int firstHalfSorted, int secondHalfSorted){
    T[] temp = (T[]) new Comparable <?>[tempArray.length];
    mergeSort(tempArray, temp, firstHalfSorted, secondHalfSorted);

}


private static <T extends Comparable<? super T>> 
void mergeSort (T[ ] tempArray, T[] a, int firstHalfSorted, int secondHalfSorted){
    if (firstHalfSorted < secondHalfSorted)
    {
        int mid =   (firstHalfSorted + secondHalfSorted) / 2;
        mergeSort(tempArray,a,firstHalfSorted, mid);
        mergeSort(tempArray,a,mid+1, secondHalfSorted);
        if(tempArray[mid].compareTo(tempArray[mid+1])>0)
            merge(tempArray,a,firstHalfSorted, mid, secondHalfSorted);
    }
}

private static <T extends Comparable<? super T>> 
void merge(T[] a, T[] tempArray, int firstHalfSorted, int mid, int secondHalfSorted)
{
    int bhalf1 = firstHalfSorted;
    int ehalf1 = mid;
    int bhalf2 = mid + 1;
    int ehalf2 = secondHalfSorted;
    int j = 0;
    for(;(bhalf1 <= ehalf1) && (bhalf2 <= ehalf2); j++)
    {
        if (a[bhalf1].compareTo(a[bhalf2]) < 0)
        {
            tempArray[j] = a[bhalf1];   
            bhalf1++;
        }
        else 
        {
            tempArray[j] = a[bhalf2];
            bhalf2++;

        }

    for(;bhalf1 <= ehalf1; bhalf2++, j++)
        tempArray[j] = a[bhalf1];   
    for(;bhalf2 <= ehalf2; bhalf2++, j++)
        tempArray[j] = a[bhalf2];   
    for(j = firstHalfSorted; j <= secondHalfSorted; j++)
        a[j] = tempArray[j];
    }
}

}

这里是应该发生的事情的示例

排序前: 泽克 鲍勃 阿里 约翰 乔迪 杰米 账单 抢 泽克 克莱顿

排序后: 阿里 账单 鲍勃 克莱顿 杰米 乔迪 约翰 抢 泽克 泽克

我做的主要驱动也在这里

package mergesort;
import java.util.ArrayList;
import java.util.Arrays;

public class Driver <T extends Comparable<? super T>>{

public Driver() {
    // TODO Auto-generated constructor stub
}

public static <T> void main(String[] args) {

       String array[] = new String[] {"Zeke,"Bob","Ali","John","Jody","Jamie","Bill","Rob", "Zeke", "Clayton"};
    MergeSort sortList = null;
    sortList.mergeSort(array,0,10);
    for(int a=0;a<array.length;a++)
        System.out.println(array[a]);
}
}

【问题讨论】:

  • 你的输出是什么?
  • 您应该为每次迭代都打印一份,这将有助于您了解实际情况
  • @Ajoy "线程 "main" 中的异常 java.lang.ArrayIndexOutOfBoundsException: 9 at mergesort.MergeSort.merge(MergeSort.java:59) at mergesort.MergeSort.mergeSort(MergeSort.java:32)在 mergesort.MergeSort.mergeSort(MergeSort.java:29) 在 mergesort.MergeSort.mergeSort(MergeSort.java:29) 在 mergesort.MergeSort.mergeSort(MergeSort.java:29) 在 mergesort.MergeSort.mergeSort(MergeSort.java: 19) 在mergesort.Driver.main(Driver.java:15) "

标签: java recursion mergesort


【解决方案1】:

您的merge 方法有很多问题。

  1. 将每个for 循环放入其中并写一个单行注释来描述它应该做什么。
  2. 不要声明一个变量(如j),然后在多个循环中重复使用它。将循环变量限制在循环范围内,例如for (int j = ..; .. ; ..)
  3. 更正缩进并确保嵌套循环确实是嵌套的。
  4. merge 方法编写几个测试用例,并仅测试该方法与所有递归。

【讨论】: