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

Java中按州首府排序二维字符串数组的冒泡排序代码解析

二维数组按首府冒泡排序的代码分步解析

首先看存储州和首府的二维数组定义:

String[][] stateCapitals = {
{"Alabama", "Montgomery"},
{"Alaska", "Juneau"},
{"Arizona", "Phoenix"},
{"Arkansas", "Little Rock"},
{"California", "Sacramento"},
{"Colorado", "Denver"},
// ... 包含剩余44个美国州的数据
};

你写出的冒泡排序代码如下:

for (int i = 0; i < stateCapitals.length - 1; i++) {
    for (int j = 0; j < stateCapitals.length - i - 1; j++) {
        if (stateCapitals[j][1].compareToIgnoreCase(stateCapitals[j + 1][1]) > 0) {
            String[] temp = stateCapitals[j];
            stateCapitals[j] = stateCapitals[j + 1];
            stateCapitals[j + 1] = temp;
        }
    }
}

下面是代码的分步执行逻辑解析:

1. 外层循环:控制排序轮次

for (int i = 0; i < stateCapitals.length - 1; i++) {
  • 变量i代表已经“归位”到数组末尾的有序元素数量。冒泡排序每一轮都会把当前未排序区域里的最大元素(按首府字典序)推到末尾,所以最多只需要执行数组长度-1轮——最后一个元素会自动处于正确位置,不需要额外处理。
  • 比如50个元素的数组,最多执行49轮,每轮结束后,末尾的i+1个元素已经是有序状态。

2. 内层循环:遍历未排序区域

for (int j = 0; j < stateCapitals.length - i - 1; j++) {
  • 变量j负责遍历数组中还未排序的前半段。因为每轮结束后末尾的i个元素已经有序,所以内层循环不需要再碰这些元素,只需要遍历到stateCapitals.length - i - 1的位置(避免重复比较已排序元素)。
  • 举例:第一轮i=0时,内层循环从0到48(共49次比较);第二轮i=1时,从0到47(共48次比较),以此类推,每轮减少一次比较。

3. 比较逻辑:按首府字典序判断

if (stateCapitals[j][1].compareToIgnoreCase(stateCapitals[j + 1][1]) > 0) {
  • stateCapitals[j][1]是第j个元素的首府字符串(数组第二个元素,索引为1),stateCapitals[j+1][1]是它下一个元素的首府。
  • compareToIgnoreCase会忽略大小写比较两个字符串:
    • 返回值大于0:说明当前首府的字典序比下一个首府大,需要交换两者位置。
    • 返回值小于等于0:当前顺序符合要求,不需要交换。

4. 交换操作:保持州与首府的绑定

String[] temp = stateCapitals[j];
stateCapitals[j] = stateCapitals[j + 1];
stateCapitals[j + 1] = temp;
  • 这里交换的是整个String[]元素(也就是州和首府的完整配对),而不是单独交换首府字符串——这样能保证每个州始终和它的首府绑定在一起,不会出现州和首府错乱的情况。
  • 临时变量temp用来存储当前元素,防止直接覆盖导致数据丢失,完成两个元素的位置互换。

内容的提问来源于stack exchange,提问作者CoderGirl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 10:55:26