我正在学习一些算法,目前我尝试将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? 谢谢你的阅读。
答案 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++];
}
}