Java中MergeSort实现中的反转和重复数字错误

时间:2013-03-31 01:28:33

标签: java mergesort inversion

我正在创建一个Java程序,我在其中实现了MergeSort算法。我的代码如下(到目前为止):

public void merge(Integer [] left, Integer[] right, Integer[] a) {

    int i = 0;                  // a[] index (A)
    int lIndex = 0;             // left[] index (B)
    int rIndex = 0;             // right[] index (C)

    // Begin main merge process
    while((lIndex < left.length) && (rIndex < right.length)) {
        if(left[lIndex] <= right[rIndex]) {
            a[i] = left[lIndex]; // Store it
            lIndex++; // Increase index of left[]
        }
        else {
            a[i] = right[rIndex]; // Store it
            rIndex++; // Increase index of right[]
        }
        i++; // Increase index of a[]
    }
    if(i == lIndex) { // If the left array is sorted
        while(rIndex < right.length) { // Copy the contents of rhe right array to a[]
            a[i] = right[rIndex];
            i++;
            rIndex++;
        }
    }
    else { // If the right array is sorted
        while(lIndex < left.length) { // Copy the contents of the left array to a[]
            a[i] = left[lIndex];
            i++;
            lIndex++;
        }
    }
}

问题是每次执行该函数时,输入数组都会返回部分排序。我的意思是大多数元素处于正确的位置,但有一两个被错误地放置,还有一些其他元素与其他元素重复!由于我无法看到真正的问题,有人可以帮助我吗?该实现是一个课程的迷你项目,我不能使用int [](让我们说)而不是Integer [],以便使用Arrays.copyOf()方法复制数组A []的内容。在此先感谢,请原谅我的语法/拼写错误。

请注意,输入数组总是2的幂(2,4,8,16等),因此每次除以2以找到中间元素的索引时,我总是得到偶数。

2 个答案:

答案 0 :(得分:2)

我认为你的问题在这里:

if(i == lIndex)

检查列表中元素是否用完的方法是:

if (lIndex == left.length)

换句话说,如果你从左边拿一些元素而从右边拿一些元素,即使你先用尽左边的数组,当你筋疲力尽时,i也不会等于lIndex左边的数组。它会更大。

答案 1 :(得分:1)

据我所知,问题在于你的合并方法,在这里:

if (i == lIndex) { // If the left array is sorted ...
当左数组被排序时,

i不一定等于lIndex。因此,并不总是执行合并的最后部分。您之前看到的重复元素会从原始数组A中遗留在未被覆盖的位置。

正确的条件是:

if (lIndex == left.length) { // If the left array is sorted ...