Java合并排序代码不起作用

时间:2012-03-17 23:01:18

标签: java mergesort

我们的老师为我们提供了Merge Sort的伪代码,如下所示

enter image description here

我想用Java实现它。我的代码如下:

public class MergeSorter {
/**
 * @param anArray
*/
    public MergeSorter(int[] anArray,int low, int high)
    {
        a = anArray;
        p = low;
        r = high;
    }
    public void sort()
    {
        if(p < r)
        {
           q = (p + r)/2;
           MergeSorter pqSorter = new MergeSorter(a, p, q);
           MergeSorter qrSorter = new MergeSorter(a, q + 1, r);
           pqSorter.sort();
           qrSorter.sort();
           merge(p, q, r);
        }
   }
private void merge(int low, int mid, int high)
{
   p = low;
   q = mid;
   r = high;
   int i;
   int j;
   int n1 = (q - p) + 1;
   int n2 = (r - q);
   int[] L = new int[n1+1];
   for (i = 0; i < n1; i++)
   {
       L[i] = a[(p + i)];
   }
   int[] R = new int[n2+1];
   for (j = 0; j < n2; j++)
       {
       R[j] = a[q + j];
       }
       L[n1] = Integer.MAX_VALUE;
       R[n2] = Integer.MAX_VALUE;
       i = 0;
       j = 0;
       for (int k = p; k < r; k++)
       {
           count = count + 1;
           if(L[i] <= R[j])
           {
               a[k] = L[i];
               i = i + 1;
           }
          else
           {
               a[k] = R[j];
               j = j + 1;
          }
       } 
    }
    private int[] a;
    private int p; 
    private int r;
    private int q;
    public int count = 0;
}

但是这段代码没有用。我想知道问题出在哪里。抱歉错误的方向图片。 更新:这是我的其他代码。它现在有剂量但没有正确排序。 这是我在下面的测试代码

    public static void main(String[] args) throws FileNotFoundException, IOException
    {
      int[] a = {1,4,6,2,10,7};
      MergeSorter sorter = new MergeSorter(a,0,a.length);
      sorter.sort();
      System.out.println(Arrays.toString(a));
     }        

结果输出[1,2,4,4,2,7]。

4 个答案:

答案 0 :(得分:1)

您在q =(p + r)/ 2处的Sort函数内缺少floor函数。你提到你修好过这个。接下来的问题是您从main调用MergeSorter sorter = new MergeSorter(a,0,a.length);。我认为必须是a.length - 1。您使用的伪代码适用于第一个元素位于索引1的数组。但是在java数组中从索引0开始。在进行更改后,您需要在合并函数内调整2个小问题。古德勒克。

答案 1 :(得分:1)

你有一些一对一的错误。

MergeSorter sorter = new MergeSorter(a,0,a.length);

数组的最后一个索引是a.length - 1

for (j = 0; j < n2; j++)
{
    R[j] = a[q + j];
}

要合并的后半部分从索引q+1r

for (int k = p; k < r; k++)

要填写的最后一个索引是r,而不是r-1,因此条件应为k <= r

此外,设置实例变量

p = low;
q = mid;
r = high;
merge()中的

很可疑。它在这里没有受到伤害,因为它们被设置为已有的值,但原则上它是错误的。

答案 2 :(得分:0)

您的代码与伪代码不完全对应。 提示:索引

仅仅因为Java是OO,并不意味着你必须在所有东西上使用对象。在这种情况下,没有它你会更好。

public static void mergeSort(int[] array) {
    mergeSort(array, 0, array.length-1);
}

private static void mergeSort(int[] array, int p, int r) {
    ...
}

private static void merge(int[] array, int p, int q, int r) {
    ...
}

答案 3 :(得分:0)

我曾经在C中写过一个合并排序,它运行正常。尝试比较一下是否有事情发生。

另外,检查您的索引,因为伪代码使用1..n中的数组索引,当您编写代码时,C,Java等语言使用0作为第一个索引。

#include <stdio.h>


int A[] = {11, 32 ,2, 7, 1, 15 };

void
merge_sort(int A[], int startIndex, int endIndex)
{
    int q = 0;
    //Terminating condition
    if (!(startIndex < endIndex)) {
       return; 
    }

    q = (startIndex + endIndex) / 2;
    merge_sort(A, startIndex, q);
    merge_sort(A, q+1, endIndex);
    printf("\n merge with start[%d], q[%d], end[%d]", startIndex,q, endIndex);
    merge(A, startIndex, q, endIndex);
}

merge(int A[], int startIndex, int q, int endIndex)
{
   int i = 0; int j = 0; int k=0;  
   int C[endIndex - startIndex + 1];
   int A1[q - startIndex + 1];
   int A2[endIndex - q];
   int lenA1 =q - startIndex + 1;
   int lenA2 = endIndex - q; 
   int iterator = 0;
   int lenA = endIndex - startIndex + 1;

   for(iterator = 0; iterator < lenA1; iterator++) {
      A1[iterator] = A[iterator + startIndex]; 
      printf("\n Iterator1[%d]", iterator + startIndex);
   }

    dump(A1, lenA1);
   for(iterator = 0; iterator < lenA2; iterator++) {
      A2[iterator] = A[iterator + q + 1]; 
      printf("\n Iterator2[%d]", iterator + q + 1);
   }

    dump(A2, lenA2);

   for (iterator = startIndex; iterator < (endIndex - startIndex + 1) && ((i < lenA1) && (j<lenA2)); iterator++)
   {
       if (A1[i] <= A2[j]) {
           A[k] = A1[i]; 
           printf("\n\t--A[k]--");
           k+=1;
           i+=1; 
       } else {
           A[k] = A2[j];
           printf("\n\t****A[k]***");
           j+=1; 
           k+=1;      
       }
   }
   if (j < lenA2) {
      for (iterator = j; iterator < lenA2; iterator++)
      {
           A[k] = A2[j];
           j+=1; 
           k+=1;      
      }
   } else if (i < lenA1) {
           A[k] = A1[i]; 
           k+=1;
           i+=1; 
   }
    dump(A, lenA);
    fflush(stdout);

}

void dump(int A[], int len)
{
    int i;
    printf("\n --------");
    for(i=0; i<len; i++)
    {
        printf("[%d] ", A[i]);
    }
}

int main()
{
    merge_sort(A, 0, 6);
    dump(A, 7);
//    dump(C, 7);
}