这是我使用的java书籍提供的合并排序算法,但代码不起作用。它返回一个数组,其中包含一些重复的数字,这些数字不在原始数字列表中。任何想法为什么这个代码不工作,谢谢?编辑:运行它的输出是:" 7 2 12 4 2 所以它复制了2#s 2 2 2 4 12
public class Nothing1{
public static void main(String[] args)
{
comp<Integer> c = new comp<Integer>();
Integer[] values1 = new Integer[5];
values1[0] = 7;
values1[1] = 2;
values1[2] = 12;
values1[3] = 4;
values1[4] = 2;
for(int index= 0; index <= values1.length-1; ++index)
{
System.out.println(values1[index]);
}
c.mergeSort(values1);
for(int index= 0; index <= values1.length-1; ++index)
{
System.out.println(values1[index]);
}
}
public static <T extends Comparable<T>> void mergeSort(T[] data)
{
mergeSort(data, 0, data.length-1);
}
private static <T extends Comparable<T>> void mergeSort(T[] data, int min, int max)
{
if(min < max)
{
int mid = (min + max)/2;
mergeSort(data, min, mid);
mergeSort(data, mid+1, max);
merge(data, min, mid, max);
}
}
private static <T extends Comparable <T>>
void merge(T[] data, int first, int mid, int last)
{
T[] temp = (T[])(new Comparable[data.length]);
int first1 = first, last1=mid;
int first2 = mid+1, last2=last;
int index = first1;
while(first1 <= last1 && first2 <= last2)
{
if(data[first1].compareTo(data[first2]) < 0)
{
temp[index] = data[first];
first1++;
}
else
{
temp[index] = data[first2];
first2++;
}
index++;
}
while(first1 <= last1)
{
temp[index] = data[first1];
first1++;
index++;
}
while(first2 <= last2)
{
temp[index] = data[first2];
first2++;
index++;
}
for(index = first; index <=last; index++)
data[index] = temp[index];
}
}
答案 0 :(得分:0)
您是否忘记更改其中一个变量,不是吗?
想象一下,当前合并数组中有4个和3个。
你的first1和last1是0 你的first2和last2是1
当你比较它时,你输入到else并将3复制到索引的第一个位置,这是正确的。然后你先移动一个。
但是4?你应该在3之后复制吧?就在索引的第二个位置。
也许我错了。
对不起,我的英语不好。
答案 1 :(得分:0)
错误基本上归结为merge
函数中的拼写错误:
private static <T extends Comparable <T>>
void merge(T[] data, int first, int mid, int last)
{
T[] temp = (T[])(new Comparable[data.length]);
int first1 = first, last1=mid;
int first2 = mid+1, last2=last;
int index = first1;
while(first1 <= last1 && first2 <= last2)
{
if(data[first1].compareTo(data[first2]) < 0)
{
// the next line has to use indices that can change during this loop
temp[index] = data[first1]; // change in this line first->first1
first1++;
}
else
{
temp[index] = data[first2];
first2++;
}
index++;
}
//...
使用错误的代码,您的数组会遇到以下情况:
7 2 12 4 2 (initial state; merge indices 0;1 next)
2 7 12 4 2 (still correct; merge indices 0-1;2 next)
2 2 12 4 2 (error here)
2 2 12 2 4
2 2 2 4 12
在错误的合并步骤中会发生以下情况:
发生错误,因为数据是从索引first
读取的,但索引first1
已更改