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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:18:06