为什么我的merge排序在java中最多只能排序4个元素



我正在尝试将患者的姓名排序到视图列表中,它将按字母顺序显示患者列表。但是,在使用合并排序(必需(之后,它最多只对四个元素进行排序,然后再覆盖其他名称。如果我能在分类时将疾病与患者联系起来,那也会很有帮助。

我尝试使用所需的合并排序,按照步骤操作后,合并排序出现故障,无法正确显示名称。当元素少于3个时,排序将正常工作,但如果元素多于3个,则会覆盖其他元素。

这是我的代码:

public static void mergeSort(ArrayList<String> a, Integer from, Integer to)
{
if(from == to)
{
return;
}
Integer mid = (from + to)/2;
mergeSort(a, from, mid);
mergeSort(a, mid+1, to);
merge(a, from, mid, to);
}
public static void merge(ArrayList<String> a, Integer from, Integer mid, Integer to)
{
Integer n = to - from + 1;
ArrayList<String> b =  new ArrayList<>(n);
Integer i1 = from;
Integer i2 = mid +1;
Integer j = 0;
while(i1<= mid && i2 <= to)
{
if(a.get(i1).compareTo(a.get(i2))<0)
{
b.add(a.get(i1));
i1++;
}
else
{
b.add(a.get(i2));
i2++;
}
j++;
}
while (i1 <= mid)
{
b.add(a.get(i1));
i1++;
j++;
}
while (i2 <= to)
{
b.add(a.get(i2));
i2++;
j++;
}
for(j = 0; j< n; j++)
{
a.add(from+j, b.get(j));;
}
}

在最后一步中应该使用set,而不是add。如果你试图调试合并过程;a";内容,您会看到它在每次合并时都会增长。

for(j = 0; j< n; j++)
{
a.set(from+j, b.get(j));;
}

此外,在Java中,编程到接口而不是具体类被认为是一种很好的风格,因此您可能希望在变量声明中用List替换ArrayList。

最新更新