
java中实现插入排序时,若直接对原arraylist进行原地排序,原始顺序将被覆盖;需通过深拷贝或重新构造列表来分别保存排序前后的状态。
java中实现插入排序时,若直接对原arraylist进行原地排序,原始顺序将被覆盖;需通过深拷贝或重新构造列表来分别保存排序前后的状态。
在使用泛型插入排序算法(如 InsertionSort<E extends Comparable<E>>)时,一个常见误区是:误将排序后的列表同时当作“原始列表”和“排序后列表”输出。正如示例代码所示,list1 在调用 insertionSort(list1) 后已被修改为升序排列,此时 System.out.println("Original List: " + list1) 实际打印的是已排序的结果,而非初始数据——这导致三组测试(整数、浮点、字符)均无法正确展示“排序前 vs 排序后”的对比效果。
要修复该问题,核心原则是:保留原始数据副本,仅对副本执行排序操作。推荐两种安全做法:
✅ 方法一:创建独立副本(推荐)
使用 new ArrayList<>(originalList) 构造新列表,确保原始列表不受影响:
// 示例:处理 test1
ArrayList<Integer> list1 = new ArrayList<>();
for (int num : test1) {
list1.add(num);
}
ArrayList<Integer> originalList1 = new ArrayList<>(list1); // ← 关键:保留原始副本
integerSorter.insertionSort(list1); // ← 对副本排序
System.out.println("Test Example 1");
System.out.println("Original List: " + originalList1); // 输出未排序状态
System.out.println("Sorted List: " + list1); // 输出排序后状态✅ 方法二:在排序前立即打印原始列表
若无需后续复用原始数据,可在调用 insertionSort() 前打印:
System.out.println("Original List: " + list1);
integerSorter.insertionSort(list1);
System.out.println("Sorted List: " + list1);⚠️ 注意事项:
- ArrayList 的构造函数 new ArrayList<>(source) 是浅拷贝,但对 Integer、Double、Character 等不可变包装类型完全安全(值语义等效于深拷贝);
- 切勿使用 list1.clone() 或 list1.toArray() 后再构造,易引发类型警告或冗余操作;
- 所有三组测试(test1/test2/test3)均需统一应用上述逻辑,否则任一组遗漏都将导致输出失真;
- 当前插入排序实现正确(时间复杂度 O(n²),稳定排序),无需修改算法逻辑,仅需调整调用流程。
最终修正后的输出将清晰呈现每组数据的原始顺序与升序结果,例如 test1 将显示:
Original List: [3, 5, 2, 4, 1, 8, 7, 6, 9] Sorted List: [1, 2, 3, 4, 5, 6, 7, 8, 9]
这才是验证排序算法正确性的标准实践。

















