【问题标题】:How to find a mistake in my Merge Sort implementation?如何在我的合并排序实现中找到错误?
【发布时间】:2016-12-13 01:34:54
【问题描述】:

我尝试编写一个归并排序算法,但我看不出哪里出错了。你能告诉我我做错了什么吗?或者建议一些有用的资源/算法实践?

public class MergeSort {

private int[] auxArray;

public void sort(int[] array)
{
    auxArray = new int[array.length];
    sort(array, 0, array.length - 1);

        for (int i = 0; i < array.length; i++) {
            System.out.println(array[i]);
      }

}

private void sort(int[] array, int begin, int end)
{
    if( begin >= end) return ;

    int middle = begin + (end - begin) / 2;

    sort(array, begin, middle);
    sort(array, middle + 1, end);
    merge(array, begin, middle, end);

}


private void merge(int[] array, int begin, int middle, int end)
{

    int i = begin;
    int j = middle + 1;

    for (int k = begin; k <= end; k++) {
        auxArray[k] = array[k];
    }

    for (int k = begin; k <= end; k++)
    {
        if(i > middle) array[k] = auxArray[j++];
        else if(j > end) array[k] = auxArray[i++];
        else if(array[i] >= array[j])
        {
            array[k] = auxArray[j++];
        }
        else
            array[k] = auxArray[i++];
    }

}

public static void main(String[] args) throws Exception {

    MergeSort sort = new MergeSort();

    int[] array = new int[] {10, 9, 8, 7, 6, 5 ,4, 3, 2 ,1};

    sort.sort(array);

}
}

【问题讨论】:

  • 你能给我们展示一个之前/之后的数据集来解释它目前的作用吗?是什么让你说它不起作用?
  • 我建议追踪end 等于begin+1 时会发生什么。换句话说,当数组中只有 1 个项目时会发生什么。
  • 在开始将array 分配给auxArray 之后,您不需要在任何private 方法中传递array 参数,在那里使用auxArray
  • (使用System.arraycopy而不是开放编码(部分)数组副本。)

标签: java algorithm sorting merge mergesort


【解决方案1】:

在merge()中,改变

        else if(array[i] >= array[j])

        else if(auxArray[i] >= auxArray[j])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-19
    • 1970-01-01
    • 1970-01-01
    • 2015-09-10
    • 2020-05-25
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多