
本文旨在解决Java中使用归并排序算法时,仅对部分元素进行排序的问题。通过分析错误代码,找出问题根源在于ArrayList的错误使用,并提供正确的代码实现。同时,强调面向接口编程的重要性,提升代码的可维护性和扩展性。
在使用归并排序算法对Java中的ArrayList进行排序时,可能会遇到排序不完整,只对部分元素生效的问题。这通常是由于在合并(merge)步骤中,错误地使用了ArrayList的add()方法,导致数组长度不断增加,最终覆盖了原始数据。下面将详细分析问题原因,并提供正确的解决方案。
问题分析
原始代码的merge()方法中,在将临时数组b中的元素复制回原始数组a时,使用了a.add(from+j, b.get(j))。add(index, element)方法会在指定索引处插入元素,导致该索引及其后面的元素后移,从而改变了ArrayList的长度。在归并排序的递归过程中,多次调用merge()方法,每次都增加ArrayList的长度,最终导致数据被覆盖和排序结果错误。
解决方案
立即学习“Java免费学习笔记(深入)”;
正确的做法是使用a.set(from+j, b.get(j))。set(index, element)方法会将指定索引处的元素替换为新元素,而不会改变ArrayList的长度。这样可以确保合并操作正确地将排序后的元素放回原始数组的正确位置。
以下是修改后的merge()方法:
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.set(from + j, b.get(j));
}
}完整代码示例
以下是完整的归并排序代码示例,包括mergeSort()和修改后的merge()方法:
import java.util.ArrayList;
import java.util.List;
public class MergeSort {
public static void mergeSort(ArrayList<String> a, Integer from, Integer to) {
if (from >= to) { // 修改:from == to 改为 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;
List<String> b = new ArrayList<>(n); // 使用 List 接口
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.set(from + j, b.get(j));
}
}
public static void main(String[] args) {
ArrayList<String> names = new ArrayList<>();
names.add("Charlie");
names.add("Alice");
names.add("Bob");
names.add("David");
names.add("Eve");
System.out.println("排序前: " + names);
mergeSort(names, 0, names.size() - 1);
System.out.println("排序后: " + names);
}
}注意事项与最佳实践
总结
通过将add()方法替换为set()方法,可以解决Java归并排序中只排序部分元素的问题。同时,遵循面向接口编程的原则,并进行充分的代码调试,可以提高代码的质量和可维护性。 此外,注意边界条件,避免数组越界等常见错误。
以上就是Java归并排序:修复排序不完整的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号