合并排序Java合并排序代码不工作
我们的老师给了我们合并排序的伪代码,如下所示
我想用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]
# 1 楼答案
在q=(p+r)/2处的Sort函数中缺少floor函数。你说过你已经修好了。下一个问题是从main调用
MergeSorter sorter = new MergeSorter(a,0,a.length);
。我认为这是必然的。您的伪代码适用于第一个元素位于索引1的数组。但在java中,数组从索引0开始。在进行更改后,您需要在合并函数中调整两个小问题。祝你好运# 2 楼答案
我以前用C写过一个合并排序,效果很好。如果有什么事发生,试着比较一下
另外,检查索引,因为伪代码使用1.中的数组索引。。n编写代码时,C、Java等语言使用0作为第一个索引
# 3 楼答案
你有几个一个接一个的错误
数组的最后一个索引是
a.length - 1
要合并的后半部分从索引
q+1
运行到r
最后一个要填充的索引是
r
,而不是r-1
,因此条件应该是k <= r
此外,实例变量的设置
在
merge()
中,鱼是腥味的。这并没有什么坏处,因为他们设定了他们已经拥有的价值观,但原则上这是错误的# 4 楼答案
您的代码与伪代码不完全对应 提示:索引
仅仅因为Java是面向对象的,并不意味着你必须在所有东西上使用对象。在这种情况下,没有它你会更好