【详解】使用Java解决:将一个数按原有规律插入已排序数组

举报
皮牙子抓饭 发表于 2026/03/13 21:49:04 2026/03/13
【摘要】 使用Java解决:将一个数按原有规律插入已排序数组在日常编程中,我们经常遇到需要对已排序的数组进行操作的情况。其中一个常见的问题是:给定一个已经按照升序或降序排列的数组,以及一个待插入的新元素,如何将这个新元素按照原有的顺序规则插入到数组中的正确位置?本文将通过Java语言实现这一功能。1. 问题描述假设我们有一个已经按照升序排列的整型数组 ​​arr​​ 和一个待插入的整数 ​​num​​...

使用Java解决:将一个数按原有规律插入已排序数组

在日常编程中,我们经常遇到需要对已排序的数组进行操作的情况。其中一个常见的问题是:给定一个已经按照升序或降序排列的数组,以及一个待插入的新元素,如何将这个新元素按照原有的顺序规则插入到数组中的正确位置?本文将通过Java语言实现这一功能。

1. 问题描述

假设我们有一个已经按照升序排列的整型数组 ​​arr​​ 和一个待插入的整数 ​​num​​。我们的任务是编写一个方法,将 ​​num​​ 插入到 ​​arr​​ 中,使得插入后的数组仍然保持升序排列。

2. 解决方案

2.1 算法思路

  1. 遍历数组:从数组的第一个元素开始,逐个比较每个元素与待插入的 ​​num​​。
  2. 确定插入位置:找到第一个大于或等于 ​​num​​ 的元素的位置,即为 ​​num​​ 应该插入的位置。
  3. 移动元素:将插入位置及其之后的所有元素向后移动一位,腾出空间插入 ​​num​​。
  4. 插入元素:将 ​​num​​ 插入到确定的位置。

2.2 Java代码实现

public class InsertIntoSortedArray {

    /**
     * 将一个数插入到已排序的数组中,并保持数组的有序性。
     * 
     * @param arr 已排序的数组
     * @param num 待插入的数
     * @return 插入后的数组
     */
    public static int[] insert(int[] arr, int num) {
        // 创建一个新的数组,长度比原数组多1
        int[] newArr = new int[arr.length + 1];
        
        // 找到插入位置
        int insertPos = 0;
        while (insertPos < arr.length && arr[insertPos] < num) {
            insertPos++;
        }
        
        // 将插入位置之前的元素复制到新数组
        System.arraycopy(arr, 0, newArr, 0, insertPos);
        
        // 插入新元素
        newArr[insertPos] = num;
        
        // 将插入位置之后的元素复制到新数组
        System.arraycopy(arr, insertPos, newArr, insertPos + 1, arr.length - insertPos);
        
        return newArr;
    }

    public static void main(String[] args) {
        int[] arr = {1, 3, 5, 7, 9};
        int num = 4;
        
        int[] result = insert(arr, num);
        
        // 输出结果
        for (int i : result) {
            System.out.print(i + " ");
        }
    }
}

2.3 代码解释

  • 创建新数组:由于插入一个元素会导致数组长度增加,因此我们需要创建一个新的数组 ​​newArr​​,其长度比原数组 ​​arr​​ 多1。
  • 确定插入位置:通过一个 ​​while​​ 循环,找到第一个大于或等于 ​​num​​ 的元素的位置 ​​insertPos​​。
  • 复制元素:使用 ​​System.arraycopy​​ 方法将插入位置之前的元素复制到新数组,然后将 ​​num​​ 插入到 ​​insertPos​​ 位置,最后将插入位置之后的元素复制到新数组。
  • 输出结果:在 ​​main​​ 方法中调用 ​​insert​​ 方法,并输出插入后的数组。

3. 性能分析

  • 时间复杂度:最坏情况下,需要遍历整个数组来找到插入位置,时间复杂度为 O(n),其中 n 是数组的长度。
  • 空间复杂度:由于创建了一个新的数组,空间复杂度为 O(n)。



在Java中,处理已排序数组并插入新元素是一个常见的任务。下面是一个简单的示例代码,展示了如何实现这一功能。

示例代码

import java.util.Arrays;

public class SortedArrayInsertion {
    public static void main(String[] args) {
        // 已排序的数组
        int[] sortedArray = {1, 3, 4, 10, 12};
        
        // 要插入的数
        int numberToInsert = 7;
        
        // 插入后的数组
        int[] resultArray = insertIntoSortedArray(sortedArray, numberToInsert);
        
        // 输出结果
        System.out.println("原始数组: " + Arrays.toString(sortedArray));
        System.out.println("插入后数组: " + Arrays.toString(resultArray));
    }

    /**
     * 将一个数插入到已排序的数组中,并保持数组有序。
     * 
     * @param sortedArray 已排序的数组
     * @param numberToInsert 要插入的数
     * @return 插入后的数组
     */
    public static int[] insertIntoSortedArray(int[] sortedArray, int numberToInsert) {
        // 创建一个新的数组,长度比原数组多1
        int[] resultArray = new int[sortedArray.length + 1];
        
        // 遍历原数组,找到插入位置
        int i;
        for (i = 0; i < sortedArray.length; i++) {
            if (numberToInsert <= sortedArray[i]) {
                break;
            }
        }
        
        // 将原数组的前i个元素复制到新数组
        System.arraycopy(sortedArray, 0, resultArray, 0, i);
        
        // 插入新元素
        resultArray[i] = numberToInsert;
        
        // 将原数组剩余的元素复制到新数组
        System.arraycopy(sortedArray, i, resultArray, i + 1, sortedArray.length - i);
        
        return resultArray;
    }
}


代码解释

  1. 定义已排序的数组和要插入的数
int[] sortedArray = {1, 3, 4, 10, 12};
int numberToInsert = 7;
  1. 调用插入方法
int[] resultArray = insertIntoSortedArray(sortedArray, numberToInsert);
  1. 插入方法 insertIntoSortedArray​:
  • 创建一个新的数组,长度比原数组多1。
  • 遍历原数组,找到插入位置。
  • 使用 ​​System.arraycopy​​ 方法将原数组的前i个元素复制到新数组。
  • 插入新元素。
  • 使用 ​​System.arraycopy​​ 方法将原数组剩余的元素复制到新数组。
  1. 输出结果
System.out.println("原始数组: " + Arrays.toString(sortedArray));
System.out.println("插入后数组: " + Arrays.toString(resultArray));

运行结果

原始数组: [1, 3, 4, 10, 12]
插入后数组: [1, 3, 4, 7, 10, 12]



如果有任何问题或需要进一步的解释,请随时告诉我。在Java中,要将一个元素插入到一个已经排序的数组中,并保持数组的有序性,可以采用以下步骤:

  1. 遍历数组:从头开始或从尾开始遍历数组,找到合适的插入位置。
  2. 移动元素:如果找到的位置不是数组的末尾,则需要将该位置及其后的所有元素向后移动一位,为新元素腾出空间。
  3. 插入元素:将新元素插入到找到的位置。

下面是一个具体的实现示例:

public class InsertIntoSortedArray {
    public static void main(String[] args) {
        // 已经排序的数组
        int[] sortedArray = {1, 3, 4, 10, 15};
        // 要插入的元素
        int elementToInsert = 7;

        // 插入元素
        int[] resultArray = insertIntoSortedArray(sortedArray, elementToInsert);

        // 打印结果数组
        for (int num : resultArray) {
            System.out.print(num + " ");
        }
    }

    public static int[] insertIntoSortedArray(int[] array, int element) {
        // 创建一个新的数组,长度比原数组多1
        int[] newArray = new int[array.length + 1];

        // 遍历原数组,找到插入位置
        int i;
        for (i = 0; i < array.length; i++) {
            if (element < array[i]) {
                break;
            }
        }

        // 将新元素插入到找到的位置
        newArray[i] = element;

        // 将原数组的前i个元素复制到新数组
        System.arraycopy(array, 0, newArray, 0, i);

        // 将原数组的剩余部分复制到新数组
        System.arraycopy(array, i, newArray, i + 1, array.length - i);

        return newArray;
    }
}

代码解释

  1. 主方法 main​:
  • 定义了一个已经排序的数组 ​​sortedArray​​ 和一个要插入的元素 ​​elementToInsert​​。
  • 调用 ​​insertIntoSortedArray​​ 方法将元素插入到数组中。
  • 打印结果数组。
  1. 方法 insertIntoSortedArray​:
  • 创建一个新的数组 ​​newArray​​,其长度比原数组多1。
  • 遍历原数组,找到第一个大于或等于要插入元素的位置 ​​i​​。
  • 将新元素插入到位置 ​​i​​。
  • 使用 ​​System.arraycopy​​ 方法将原数组的前 ​​i​​ 个元素复制到新数组的前 ​​i​​ 个位置。
  • 使用 ​​System.arraycopy​​ 方法将原数组的剩余部分复制到新数组的 ​​i+1​​ 位置及其之后的位置。
  • 返回新的数组 ​​newArray​​。

注意事项

  • 如果数组是升序排列的,代码中的比较条件 ​​element < array[i]​​ 是正确的。
  • 如果数组是降序排列的,需要将比较条件改为 ​​element > array[i]​​。
  • 这种方法的时间复杂度是 O(n),其中 n 是数组的长度,因为最坏情况下需要遍历整个数组并移动所有元素。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。