Java数组排序求助:合并数组后无法实现正确升序排列
问题分析:Java数组合并后排序错误的原因与修复方案
嘿,我看了你这段Java代码,问题出在你自己手写的排序逻辑上——这个逻辑完全不符合正确的排序思路,才导致输出结果乱掉了。咱们一步步来拆解问题,再给你修复方案:
核心错误点
你合并两个数组的部分是没问题的,arr5在合并后确实是[0,3,4,31,4,6,30],但后面的排序循环逻辑完全错误:
- 你试图用
small和large两个指针分别从首尾往中间走,但每次比较后直接覆盖原数组的元素,导致原始数据被丢失。比如当你执行arr5[small] = arr5[f]时,原来arr5[small]的值就被覆盖了,后续循环再也拿不到这个原始值;else分支的arr5[large] = arr5[f]也一样,会把后面的元素直接替换掉,最后数组里全是被错误覆盖后的混乱值。 - 这个逻辑根本不是任何一种标准排序算法的实现,完全达不到升序排序的效果。
修复方案
方案1:使用Java内置排序(最简单高效)
Java的Arrays类已经提供了成熟的排序方法,合并数组后直接调用即可,完全不用自己写容易出错的排序逻辑:
import java.util.Arrays; public class ArraySortDemo { public static void main(String[] args) { // merge these arrays: ([0,3,4,31],[4,6,30]) int[] arr3 = { 0, 3, 4, 31 }; int[] arr4 = { 4, 6, 30 }; int[] arr5 = new int[arr3.length + arr4.length]; // 合并数组的逻辑是对的,保留这部分 for (int i = 0; i < arr3.length; i++) { arr5[i] = arr3[i]; } for (int k = 0; k < arr4.length; k++) { arr5[arr3.length + k] = arr4[k]; } // 直接调用内置排序方法,实现升序排序 Arrays.sort(arr5); // 打印结果 System.out.println(Arrays.toString(arr5)); } }
运行这段代码,就能得到你预期的[0, 3, 4, 4, 6, 30, 31]。
方案2:自己实现基础排序算法(适合学习)
如果你想手动实现排序来加深理解,推荐从简单的选择排序或冒泡排序入手。这里给你写一个选择排序的实现,替换掉你原来的错误排序逻辑:
import java.util.Arrays; public class ArraySortDemo { public static void main(String[] args) { int[] arr3 = { 0, 3, 4, 31 }; int[] arr4 = { 4, 6, 30 }; int[] arr5 = new int[arr3.length + arr4.length]; // 合并数组 for (int i = 0; i < arr3.length; i++) { arr5[i] = arr3[i]; } for (int k = 0; k < arr4.length; k++) { arr5[arr3.length + k] = arr4[k]; } // 手动实现选择排序:每次找到未排序部分的最小值,放到已排序部分的末尾 for (int i = 0; i < arr5.length - 1; i++) { int minIndex = i; // 寻找当前未排序部分的最小值索引 for (int j = i + 1; j < arr5.length; j++) { if (arr5[j] < arr5[minIndex]) { minIndex = j; } } // 交换当前位置和最小值的位置 int temp = arr5[i]; arr5[i] = arr5[minIndex]; arr5[minIndex] = temp; } System.out.println(Arrays.toString(arr5)); } }
这个逻辑的核心是:每次只交换元素的位置,不会丢失原始数据,通过两轮循环找到最小值并放到正确的位置,最终实现升序排序。
内容的提问来源于stack exchange,提问作者marcosvaldez81
相关产品推荐
相关产品推荐

