不使用java.util.Arrays实现字符串及关联int数组冒泡排序咨询
冒泡排序关联数组实现建议
现有代码存在的问题
- 排序逻辑不符:你当前写的是选择排序的实现逻辑(每轮固定位置和后续所有元素比较,将最小值移到当前位置),和你要实现的冒泡排序目标不匹配
- 关联数组同步不全:交换时只处理了
name和itemsToSell两个数组,传入的amountBought数组没有同步交换,排序后会出现姓名和已购数值不匹配的问题 - 输出逻辑异常:输出语句写在排序的内层循环里,会打印大量排序中间状态,且数组最后一个元素不会被输出
- 缺少边界校验:没有判断输入数组是否为null、三个数组长度是否一致,也没有处理
name元素为null的场景,容易触发运行时异常
优化后的冒泡排序实现
严格遵循冒泡排序相邻元素两两比较交换的逻辑,同时保证三个关联数组同步调整,兼容边界场景:
public static void sortAndPrintNames(String[] name, int[] itemsToSell, int[] amountBought) { // 参数合法性校验 if (name == null || itemsToSell == null || amountBought == null) { System.out.println("输入数组不能为null"); return; } if (name.length != itemsToSell.length || name.length != amountBought.length) { System.out.println("三个数组长度必须一致"); return; } int len = name.length; if (len <= 1) { // 数组长度小于等于1无需排序直接输出 for (int k = 0; k < len; k++) { System.out.println(name[k] + '\t' + itemsToSell[k] + "\t\t" + amountBought[k]); } return; } boolean swapped; // 冒泡排序外层循环:控制排序轮次 for (int i = 0; i < len - 1; i++) { swapped = false; // 内层循环:两两比较相邻元素,已沉底的i个元素无需再比较 for (int j = 0; j < len - 1 - i; j++) { // 兼容姓名为null的场景,默认将null排在最前面 if (name[j] == null && name[j+1] != null) { swap(name, itemsToSell, amountBought, j, j+1); swapped = true; continue; } if (name[j] == null || name[j+1] == null) { continue; } // 按字母升序比较,顺序不对则交换 if (name[j].compareTo(name[j+1]) > 0) { swap(name, itemsToSell, amountBought, j, j+1); swapped = true; } } // 本轮没有交换说明数组已经有序,提前终止排序 if (!swapped) { break; } } // 排序完成后统一输出结果 for (int k = 0; k < len; k++) { System.out.println(name[k] + '\t' + itemsToSell[k] + "\t\t" + amountBought[k]); } } // 抽取公共交换方法,避免重复代码 private static void swap(String[] name, int[] itemsToSell, int[] amountBought, int a, int b) { // 交换姓名 String tempName = name[a]; name[a] = name[b]; name[b] = tempName; // 交换待售商品数量 int tempItem = itemsToSell[a]; itemsToSell[a] = itemsToSell[b]; itemsToSell[b] = tempItem; // 交换已购买数量 int tempAmount = amountBought[a]; amountBought[a] = amountBought[b]; amountBought[b] = tempAmount; }
实现要点说明
- 符合冒泡排序特性:通过相邻元素比较交换实现排序,每轮将当前最大元素沉到数组末尾,通过交换标记提前终止有序数组的排序,最优时间复杂度可达O(n)
- 关联关系完全同步:交换时同时处理三个数组的对应索引元素,保证姓名和对应的数值永远匹配
- 异常场景兼容:覆盖了空数组、长度不一致、姓名为null等边缘场景,避免运行时崩溃
- 逻辑清晰易维护:将交换逻辑抽取为独立方法,减少重复代码,排序和输出逻辑拆分,可读性更高
内容的提问来源于stack exchange,提问作者Carl
相关产品推荐
相关产品推荐

