我在Mergesort算法中哪里犯了错误

时间:2014-06-26 13:47:00

标签: java algorithm

我正在学习一些算法,目前我尝试将Mergesort实现为Java。这是我的代码:

public class Mergesort {

/**
 * @param args
 */
public static void main(String[] args) {
    int []a = {12,34,6543,3,6,45,23,677,56,67,3,4,54,5};
    sort(a);
    for(int i:a)
    {
        System.out.println(i);
    }

}
private static void merge(int[]a,int[]b,int[]c)
{
    int i = 0, j = 0, k = 0; 
    while((i < b.length) && (j < c.length))
    {
        if(b[i] < c[j])
        {
            a[k++] = b[i++];   
        }
        else
        {
            a[k++] = c[j++];
        }

        while( i < b.length)
        {
            a[k++] = b[i++];
        }

        while( j < c.length)
        {
            a[k++] = c[j++];
        }
    }

}

public static void sort (int[]a)
{
        if(a.length > 1)
    {

    int m = a.length / 2;
    int[]b = new int[m];
    int[]c = new int[a.length-m];

    for(int i = 0; i < m; i++)
    {
        b[i] = a[i];
    }
    for(int i = m; i <a.length; i++ )
    {
        c[i-m] = a[i];
    }

    sort(b);
    sort(c);

    merge(a,b,c);
    }
}
}

这是输出:

6543
6
23
45
56
677
67
4
5
54

我从教程中复制了这个,但我不知道错误在哪里。我的第二个问题是:

这是什么意思:a [k ++] == b [i ++];

我知道我们正在改变a [k](k = a中的位置)到b [i]的值,但是为什么++?

我认为这意味着您将值增加1? 谢谢你的阅读。

2 个答案:

答案 0 :(得分:1)

这是什么意思:

a[k++] == b[i++]; 

++是增量运算符。请参阅Assignment, Arithmetic, and Unary Operators

下的 一元运算符

这相当于

a = a + 1

所以

a[k++] == b[i++]; 

相同
a[k] == b[i]; 
k = k + 1;
i = i + 1;

Wny是我的代码不工作是offtopic。请调试并询问任何具体问题

答案 1 :(得分:0)

您的合并例程错误。第二个和第三个while循环应该在第一个while循环中。它们应该在它之外。

第一个while循环比较两个数组中的项目,直到其中一个数组中没有剩余元素。 只有在完成后,才能发挥第二和第三个循环的作用。

第二个和第三个循环(其中只有一个循环在任何合并调用中实际执行任何工作)处理包含最高值的数组的其余部分。

因此它看起来应该是这样的:

private static void merge(int[]a,int[]b,int[]c)
{
    int i = 0, j = 0, k = 0; 
    while((i < b.length) && (j < c.length))
    {
        if(b[i] < c[j])
        {
            a[k++] = b[i++];   
        }
        else
        {
            a[k++] = c[j++];
        }
    }
    while( i < b.length)
    {
        a[k++] = b[i++];
    }

    while( j < c.length)
    {
        a[k++] = c[j++];
    }
}