You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 05:36:08