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
相关产品推荐
相关产品推荐

