Java 什么';合并两个排序数组有什么问题? void排序(int a[],int b[],int m,int n) { int e=m+n; 而(m>=0&&n>=0) { 如果(a[m]>b[n]) { a[e]=a[m]; m--; e--; } 如果(a[e]

Java 什么';合并两个排序数组有什么问题? void排序(int a[],int b[],int m,int n) { int e=m+n; 而(m>=0&&n>=0) { 如果(a[m]>b[n]) { a[e]=a[m]; m--; e--; } 如果(a[e],java,arrays,merge,Java,Arrays,Merge,我得到的输出是1 2 3 7 8 0而不是1 2 3 7 8加上或不加上第三个else条件。如果开始e太低,它应该是m+n+1 想想看,对于两个三元素数组,m和n都是两个。这意味着您将从4开始,使用m+n,而对于六元素结果,您应该从5开始 这是一个相对简单的一个错误 您还可以通过简单地忽略相等来解决当值相等时丢失值的另一个问题。如果大于或等于,则选择a,否则选择b 循环继续逻辑是错误的,如果您首先耗尽了a(使用a={2,2,3}和b={1,7,8}来了解我的意思)。只有a和b都有剩余元素时,才能

我得到的输出是
1 2 3 7 8 0
而不是
1 2 3 7 8
加上或不加上第三个else条件。

如果开始
e
太低,它应该是
m+n+1

想想看,对于两个三元素数组,
m
n
都是两个。这意味着您将从4开始,使用
m+n
,而对于六元素结果,您应该从5开始

这是一个相对简单的一个错误

您还可以通过简单地忽略相等来解决当值相等时丢失值的另一个问题。如果大于或等于,则选择
a
,否则选择
b

循环继续逻辑是错误的,如果您首先耗尽了
a
(使用
a={2,2,3}
b={1,7,8}
来了解我的意思)。只有
a
b
都有剩余元素时,才能继续。当其中任何一个元素剩余时,您应该继续

您可以将该循环保持原样,但添加两个其他循环(其中只有一个循环实际会执行任何操作)以耗尽其他列表来修复此问题

作为支持,我提供了以下C代码(因为我比Java更快,但排序例程本身应该基本相同):

其输出为:

int main(void) {
    int a[6] = {2,2,3};
    int b[] = {1,7,8};
    sort (a, b, 2, 2);
    printf ("%d %d %d %d %d %d\n", a[0], a[1], a[2], a[3], a[4], a[5]);
    return 0;
}
正如所料


以及等效的Java代码:

1 2 2 3 7 8
连同其测试套件:

class Test {
    static void sort (int a[], int b[], int m, int n) {
        // Start at correct offset for target array.

        int e = m + n + 1;

        // Until one list empty, choose the correct value.

        while (m >= 0 && n >= 0)
            if (a[m] >= b[n])
                a[e--] = a[m--];
            else
                a[e--] = b[n--];

        // If b was empty, just transfer a.

        while (m >= 0)
            a[e--] = a[m--];

        // If a was empty, just transfer b.

        while (n >= 0)
            a[e--] = b[n--];
    }
static public void main(字符串[]args){
int a[]=新int[6];
a[0]=2;a[1]=2;a[2]=3;
int b[]=新int[3];
b[0]=1;b[1]=7;b[2]=8;
排序(a、b、2、2);
对于(int i=0;i<6;i++)
System.out.println(a[i]);
}
}  

事实上,由于您正在向
a
写入数据,因此实际上可以省略中间的循环(
而(m>=0)
一)。这是因为,在这种情况下,您只是将元素转移到它们自己


我将保留它,因为如果您要写入的数组不在适当的位置,它将变得非常重要,但如果您希望针对您的特定情况删除它,则可以删除它。

这是您的else语句。a和b中的元素是相同的,因此您应该同时插入这两个元素,并且顺序无关紧要。而是只插入b中的值。或者您可以取消第二个条件,并按如下所示进行更改:

    static public void main(String[] args) {
        int a[] = new int[6];
        a[0] = 2; a[1] = 2; a[2] = 3;
        int b[] = new int[3];
        b[0] = 1; b[1] = 7; b[2] = 8;
        sort (a, b, 2, 2);
        for (int i = 0; i < 6; i++)
            System.out.println (a[i]);
    }
}  

我不这么认为。这在线程“main”java.lang.ArrayIndexOutOfBoundsException中给出了一个
异常:-1
@noMAD,是的,对不起,方向错误,应该是正1而不是负1。更新以修复。
class Test {
    static void sort (int a[], int b[], int m, int n) {
        // Start at correct offset for target array.

        int e = m + n + 1;

        // Until one list empty, choose the correct value.

        while (m >= 0 && n >= 0)
            if (a[m] >= b[n])
                a[e--] = a[m--];
            else
                a[e--] = b[n--];

        // If b was empty, just transfer a.

        while (m >= 0)
            a[e--] = a[m--];

        // If a was empty, just transfer b.

        while (n >= 0)
            a[e--] = b[n--];
    }
    static public void main(String[] args) {
        int a[] = new int[6];
        a[0] = 2; a[1] = 2; a[2] = 3;
        int b[] = new int[3];
        b[0] = 1; b[1] = 7; b[2] = 8;
        sort (a, b, 2, 2);
        for (int i = 0; i < 6; i++)
            System.out.println (a[i]);
    }
}  
void sort(int a[], int b[], int m, int n)
    {
        int e = m + n + 1;
        while(m >=0 && n >=0)
        {
            if(a[m] > b[n])
            {
                a[e] = a[m];
                m--;
                e--;
            }
            else 
            {
                a[e] = b[n];
                n--;
                e--;
            }

        }
    }