Java实现插入排序并仅打印交换后的无重复排序过程
插入排序代码优化:解决重复输出问题
问题说明
现有Java插入排序代码存在重复输出问题,需要修改为:
- 仅在元素交换发生时打印当前数组,消除重复内容
- 输入已排序数组时,无任何输出
原代码
import java.util.Scanner; import java.util.Arrays; public class Main { public static void main(String[] args) { int i, temp, n, j ,num, array[], counter, k; Scanner input = new Scanner(System.in); num = input.nextInt(); array = new int[num]; n = array.length; temp = 0; for (counter = 0; counter < num; counter++) array[counter] = input.nextInt(); for (i = 1; i < array.length; i++) { for (j = i; j > 0; j--) { if (array[j - 1] > array[j]) { temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; } for(k=0; k<n; k++)System.out.print(array[k]+ " "); System.out.print("\n"); } } } }
问题根源
原代码内层循环每次迭代都会执行打印,无论是否发生交换,导致大量重复输出;同时输入已排序数组时,无交换却仍会多次打印数组,不符合要求。
修复后的代码
import java.util.Scanner; public class Main { public static void main(String[] args) { int i, temp, n, j, num, array[], counter, k; Scanner input = new Scanner(System.in); num = input.nextInt(); array = new int[num]; n = array.length; // 读取输入数组 for (counter = 0; counter < num; counter++) { array[counter] = input.nextInt(); } for (i = 1; i < array.length; i++) { for (j = i; j > 0; j--) { if (array[j - 1] > array[j]) { // 执行元素交换 temp = array[j]; array[j] = array[j - 1]; array[j - 1] = temp; // 仅交换后打印数组,避免末尾空格 for (k = 0; k < n; k++) { System.out.print(array[k]); if (k != n - 1) { System.out.print(" "); } } System.out.println(); } else { // 无交换说明元素已在正确位置,提前终止内层循环 break; } } } input.close(); } }
关键修改点
- 打印逻辑限制:将数组打印代码移至交换操作的
if块内,确保只有交换发生时才输出。 - 格式修正:优化打印逻辑,移除数组末尾的多余空格,匹配期望输出格式。
- 效率提升:当无交换发生时,直接跳出内层循环,减少不必要的迭代。
验证结果
测试输入(已排序数组):
5 1 2 3 4 5输出:无任何内容,符合要求。
测试输入(未排序数组):
8 8 4 3 7 6 5 2 1输出为每次交换后的数组状态,无重复内容。
内容的提问来源于stack exchange,提问作者Henry Liu
相关产品推荐
相关产品推荐

