我试图实现合并排序,但我得到的输出是相同的数组

时间:2015-01-16 15:41:50

标签: java mergesort

我正在尝试实现合并排序,但我得到的输出是相同的数组。这个合并排序给了我与input.plz help.i'相同的输出。我很确定实现是正确的我试过调试但是无法弄清楚错误。

解决:我正在将助手[左]与助手[中]进行比较,而不是右手助手。谢谢你的帮助。

public class Sort {

  public static void main(String[] args){
     int arr[] = {3,5,6,9,0,2,4};
    Sort sort = new Sort();
    int i=0;
    sort.MergeSort(arr);
    for(i=0;i<arr.length;i++){
        System.out.print(arr[i]);
    }
  }


  private void MergeSort(int[] arr2) {
    // TODO Auto-generated method stub
    int helper[] = new int[arr2.length];

    MergeSort(arr2,helper,0,arr2.length-1);


  }


  private  void MergeSort(int[] arr2,int[] helper,int start, int end) {
    if(start<end){
        int mid = (start+end)/2;
        MergeSort(arr2,helper,start,mid);
        MergeSort(arr2,helper,mid+1,end);
        Merge(arr2,helper,start,mid,end);


    }else{
        //do nothing
    }

  }


  private  void Merge(int[] arr2, int[] helper, int start, int mid, int end) {
    // TODO Auto-generated method stub
    int i;
    for(i=start;i<=end;i++){
        helper[i]=arr2[i];
    }
    i=start;
    int left = start;
    int right = mid+1;
    while(left <= mid && right <= end){
        if(helper[left] <= helper[mid]){
            arr2[i] = helper[left];
            left++;
        }else{
            arr2[i] = helper[right];
            right++;
        }
        i++;
    }
        //move remaining of left to array
        int remaining = mid-left;
        int j;
        for(j=0;j<=remaining;j++){
            arr2[i+j]=helper[left+j];
        }
  }
}

2 个答案:

答案 0 :(得分:3)

整蛊......: - )

您始终将left处的元素与mid处的元素进行比较,而不是right处的元素:

while(left <= mid && right <= end){
    if(helper[left] <= helper[mid]){

应该是

while(left <= mid && right <= end){
    if(helper[left] <= helper[right]){

可选,但更清楚:
此外,正如马特所提到的,你缺少从右臂追上剩余价值

while (left <= mid)
    arr2[i++] = helper[left++];

while (right <= end) {
    arr2[i++] = helper[right++];

编辑:将右臂追赶标记为可选

答案 1 :(得分:1)

我认为你的merge()函数缺少某种情况。

 //move remaining of left to array
 int remaining = mid-left;
 int j;
 for(j=0;j<=remaining;j++){
     arr2[i+j]=helper[left+j];
 }
如果右子阵列首先耗尽,

会处理,但如果左子阵列首先耗尽则不考虑这种情况(这可能会导致一些异常结果)。我知道这不是你要问的问题,我会继续查看你的代码,看看我是否可以提供帮助。

快乐的编码!如果您有任何问题,请发表评论。