Java语言怎么不断将新输入的数据,插入到现有数组中并且保持现有数组从小到大排列的有序性呢

Java语言怎么不断将新输入的数据,插入到现有数组中并且保持现有数组从小到大排列的有序性呢?数组的有序操作可以不借助排序就实现么

使用插入排序算法
效果如图

img

代码

import java.util.Arrays;

public class InsertionSort {
    public static void main(String[] args) {
        int[] arr = {3, 8, 12, 5, 2}; // 初始有序数组

        int newValue = 7;  // 新输入的数据

        // 扩展数组
        arr = Arrays.copyOf(arr, arr.length + 1);

        // 插入新元素到正确的位置
        int i;
        for (i = arr.length - 2; i >= 0 && arr[i] > newValue; i--) {
            arr[i + 1] = arr[i];
        }
        arr[i + 1] = newValue;

        // 打印有序数组
        System.out.println(Arrays.toString(arr));
    }
}


每插入一个数,找到前一个比他小,后一个比他大的位置插入进去即可

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 你可以参考下这个问题的回答, 看看是否对你有帮助, 链接: https://ask.csdn.net/questions/744940
  • 你也可以参考下这篇文章:Java_有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
  • 您还可以看一下 汪翠老师的java项目实战之欢乐斗地主游戏开发教程 毕业项目课程设计带源码课程中的 给扑克牌绑定鼠标事件实现单击可以选择出牌列表小节, 巩固相关知识点
  • 除此之外, 这篇博客: java初级程序员必备的算法和数据结构入门只是,编程界的敲门砖,算法合集,简单详细中的 如何判断是否为排序好的数组 部分也许能够解决你的问题。
  • 以下回答由chatgpt基于相关博客总结生成:

    问题优化: Java语言中如何将新输入的数据插入现有数组并保持有序性?

    问题描述:

    我想在Java语言中不断将新输入的数据插入到现有数组中,并且要求保持数组的有序性(从小到大排序)。请问如何实现这个需求?是否有一种方法可以实现有序插入而不需要进行排序操作?

    问题标签: Java语言, 数据结构, 数组, 有序插入


    为了实现有序插入而不需要进行排序操作,我建议使用二分查找算法来找到插入位置。

    下面是实现这个需求的步骤:

    1. 创建一个函数insertAndSort,其参数包括一个已排序的整型数组以及一个新的整数值。

    2. insertAndSort函数内,使用二分查找算法来确定新值的插入位置。二分查找的步骤如下:

    3. 定义一个start变量并设置为0,表示当前搜索范围的起始位置。
    4. 定义一个end变量并设置为数组长度减1,表示当前搜索范围的结束位置。
    5. 如果start大于end,说明新值应该插入在start位置上,跳到步骤4。
    6. 计算mid变量为(start + end) / 2,表示当前搜索范围的中间位置。
    7. 如果新值小于mid位置的值,则将end更新为mid - 1,表示新值可能在左边的子数组中。
    8. 否则,将start更新为mid + 1,表示新值可能在右边的子数组中。
    9. 跳到步骤3。

    10. 根据二分查找算法的结果,将新值插入到数组中的正确位置。这可以通过使用System.arraycopy()方法将插入位置以及之后的元素向后移动一位,并将新值插入到插入位置上完成。

    11. 返回插入后的有序数组。

    下面是具体实现的Java代码示例:

    public class Main {
        public static void main(String[] args) {
            int[] sortedArray = {1, 4, 6, 8, 10}; // 已排序的数组
            int newValue = 5; // 新的整数值
    
            int[] newArray = insertAndSort(sortedArray, newValue); // 插入并排序
            for (int i = 0; i < newArray.length; i++) {
                System.out.println(newArray[i]);
            }
        }
    
        public static int[] insertAndSort(int[] sortedArray, int newValue) {
            int start = 0;
            int end = sortedArray.length - 1;
    
            while (start <= end) {
                int mid = (start + end) / 2;
                if (sortedArray[mid] == newValue) {
                    start = mid;
                    break;
                } else if (sortedArray[mid] < newValue) {
                    start = mid + 1;
                } else {
                    end = mid - 1;
                }
            }
    
            int[] newArray = new int[sortedArray.length + 1];
            System.arraycopy(sortedArray, 0, newArray, 0, start);
            newArray[start] = newValue;
            System.arraycopy(sortedArray, start, newArray, start + 1, sortedArray.length - start);
    
            return newArray;
        }
    }
    

    运行这段示例代码,将输出有序数组1, 4, 5, 6, 8, 10。新值5被成功插入到了正确的位置上。

    这种方法能够在O(log n)的时间复杂度内完成插入操作,而不需要对整个数组进行排序。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^
import java.util.Arrays;

public class ArraySort {
    public static void main(String[] args) {
        //初始数组:array
        int[] array = new int[]{10, 20, 30, 40, 50, 60, 70, 80, 90, 100};
        int a = 63;
        array = arrayAdd(a, array);
        System.out.println(Arrays.toString(array));
        a = 65;
        array = arrayAdd(a, array);
        System.out.println(Arrays.toString(array));
    }


    public static int[] arrayAdd(int a, int[] array) {
        //采用二分法找到a在array中的大小位置;
        int index = binarySearch(array, a);
        //创建一个新数组,放置添加数a
        int[] newArray = new int[array.length + 1];
        //采用 System.arraycopy 方法复制数组
        System.arraycopy(array, 0, newArray, 0, index);
        newArray[index] = a;
        System.arraycopy(array, index, newArray, index + 1, array.length - index);
        return newArray;
    }

    private static int binarySearch(int[] array, int a) {
        int low = 0;
        int high = array.length - 1;
        int mid = 0;
        while (low <= high) {
            //获取中间数编号
            mid = (low + high) / 2;
            //获取中间数
            int midVal = array[mid];
            //根据中间数与a大小,重新取值边界
            if (midVal < a) {
                low = mid + 1;
            } else {
                high = mid - 1;
            }
        }
        return mid;
    }
}