Java 这种合并排序有什么问题? int[]输入=[6,5,4,3,2,1] 合并排序(输入,0,输入.长度) 无效合并排序(int[]A,int p,int r){ if(p=n1或j>=n2)。在这些情况下(即L或R中的一个“耗尽”了成员),您应该使用另一个数组

Java 这种合并排序有什么问题? int[]输入=[6,5,4,3,2,1] 合并排序(输入,0,输入.长度) 无效合并排序(int[]A,int p,int r){ if(p=n1或j>=n2)。在这些情况下(即L或R中的一个“耗尽”了成员),您应该使用另一个数组,java,sorting,groovy,mergesort,Java,Sorting,Groovy,Mergesort,首先,虽然这是Groovy,因此@Uffuse突出显示的负索引不会抛出异常,但它表明存在问题 我认为你有两个问题:警告:我不熟悉“算法简介”中的确切表述 填充L和R的A中的索引为1-它们应为[p+i](从而避免可能的负索引问题)和[q+j+1]。注意,根据此修订,您需要将长度-1作为R的起始参数传递。 在底部的测试中,为了确定在重新填充A的元素时使用L和R中的哪一个,您没有检查超出这些数组长度的i或j(即i>=n1或j>=n2)。在这些情况下(即L或R中的一个“耗尽”了成员),您应该使用另一个数

首先,虽然这是Groovy,因此@Uffuse突出显示的负索引不会抛出异常,但它表明存在问题

我认为你有两个问题:警告:我不熟悉“算法简介”中的确切表述

  • 填充L和R的A中的索引为1-它们应为[p+i](从而避免可能的负索引问题)和[q+j+1]。注意,根据此修订,您需要将长度-1作为R的起始参数传递。
  • 在底部的测试中,为了确定在重新填充A的元素时使用L和R中的哪一个,您没有检查超出这些数组长度的i或j(即i>=n1或j>=n2)。在这些情况下(即L或R中的一个“耗尽”了成员),您应该使用另一个数组
  • 下面的代码适用于您的示例,我没有对其进行过广泛的测试,但已经尝试过重复数字、负数等情况,并且相信它应该能起作用:

    int i = 0
    ...
    for(;i<n1;i++){ L[i] = A[p+i-1] }
    
    int[]输入=[6,5,4,3,2,1]
    合并排序(输入,0,输入。长度-1)
    System.out.println(Arrays.toString(输入))
    无效合并排序(int[]A,int p,int r){
    if(p对于(;i首先,虽然这是Groovy,因此@Uffuse突出显示的负索引不会抛出异常,但它表明存在问题

    我认为你有两个问题:警告:我不熟悉“算法简介”中的确切表述

  • 填充L和R的A中的索引为1-它们应为[p+i](从而避免可能的负索引问题)和[q+j+1]。注意,根据此修订,您需要将长度-1作为R的起始参数传递。
  • 在底部的测试中,为了确定在重新填充A的元素时使用L和R中的哪一个,您没有检查超出这些数组长度的i或j(即i>=n1或j>=n2)。在这些情况下(即L或R中的一个“耗尽”了成员),您应该使用另一个数组
  • 下面的代码适用于您的示例,我没有对其进行过广泛的测试,但已经尝试过重复数字、负数等情况,并且相信它应该能起作用:

    int i = 0
    ...
    for(;i<n1;i++){ L[i] = A[p+i-1] }
    
    int[]输入=[6,5,4,3,2,1]
    合并排序(输入,0,输入。长度-1)
    System.out.println(Arrays.toString(输入))
    无效合并排序(int[]A,int p,int r){
    if(p
    对于(;i无论你在哪里乱搞索引并试图在不检查边界的情况下访问数组的元素,你都在乱搞魔鬼。@marounnmaroun请你更正代码好吗?:)你难道看不到异常是从哪一行引发的吗?@无用它指向比较行
    if(L[i]是这样的,您应该只使用这个代码段来实现吗?还是可以使用任何新的方法?无论您在哪里乱搞索引,试图访问数组的元素而不检查边界,都是在与魔鬼作对。@marounnaroun请更正代码好吗?:)你看不到异常是从哪一行抛出的吗?@Uffused It指向比较行
    (L[i]是这样的,你应该只使用这个代码片段实现吗?还是可以使用任何新的方法?这不是问题的根源。我在IdeOne上运行了这个示例并发布了链接,以防有人想看到:)@LittleChild-你在IdeOne上发布的内容不正确。请查看你的代码的正确版本。它在上面提到的点处失败,因为它的计算结果将为-1。这不是问题的根源。我在IdeOne上运行了示例并发布了链接,以防有人想看到:)@LittleChild-你在IdeOne上发布的内容不正确。请查看你的代码的正确版本。它在无用的地方失败了,因为它的计算结果将为-1。这本书使用数组的
    1
    索引,而不是
    0
    。这是导致问题的原因吗?啊。是的,可能会这样。如果你看看我所做的编辑,它有效地将所有东西“转移”到一个地方。检查“用完”最后L和R中的成员数可能仍然需要。我欠你一个!非常感谢!这本书对数组使用
    1
    索引,而不是
    0
    。这就是导致问题的原因吗?啊。是的,可能会这样。如果你看一下我所做的编辑,它实际上是在“移动”所有的东西都放在一个地方。最后L和R的成员“用完”的检查可能还是需要的。我欠你一个!非常感谢!
    int[] input = [6,5,4,3,2,1]
    mergeSort(input,0,input.length-1)
    System.out.println(Arrays.toString(input))     
    
    void mergeSort(int[] A,int p,int r){
        if(p < r){
            int q = (int) Math.floor((p+r)/2)
            mergeSort(A,p,q)
            mergeSort(A,q+1,r)
            merge(A,p,q,r)
        }
    }
    
    void merge(int[] A,int p,int q,int r) {
        int i = 0
        int j = 0
        int n1 = q - p + 1
        int n2 = r - q
        int[] L = new int[n1]
        int[] R = new int[n2]
        for(;i<n1;i++){ L[i] = A[p+i] }
        for(;j<n2;j++){ R[j] = A[q+j+1] }
        i = j = 0
        for(int k = p; k <= r; k++){
            if(j >= n2 || (i < n1 && L[i] < R[j] )) { A[k] = L[i++] }
            else{ A[k] = R[j++] }
        }    
    }