Java中的10000000整数数组插入排序

Java中的10000000整数数组插入排序,java,arrays,sorting,insertion,Java,Arrays,Sorting,Insertion,因此,我已经正确地编写了插入排序代码,它将成功地创建1000到9999之间10、1000、100000和1000000个整数的数组,并很好地完成插入排序算法。然而,当我尝试10000000个整数的最后一步时,数组被创建,但代码永远不会完全完成。我给了它足够的时间来完成,最多4到5个小时,但没有用。有人知道这里可能有什么问题吗?执行者是否在理解这么多整数时遇到问题,或者问题的根源是什么?我已经包括了我写的插入算法的副本 public static void insertion(int[]

因此,我已经正确地编写了插入排序代码,它将成功地创建1000到9999之间10、1000、100000和1000000个整数的数组,并很好地完成插入排序算法。然而,当我尝试10000000个整数的最后一步时,数组被创建,但代码永远不会完全完成。我给了它足够的时间来完成,最多4到5个小时,但没有用。有人知道这里可能有什么问题吗?执行者是否在理解这么多整数时遇到问题,或者问题的根源是什么?我已经包括了我写的插入算法的副本

    public static void insertion(int[] a) {
    int n = a.length;

    for(int i = 1; i < n; i++) {
        int j = i -1;
        int temp = a[i];

        while(j > 0 && temp < a[j]) {
            a[j+1] = a[j];
            j--;
        }
        a[j+1] = temp;
    }
}
公共静态无效插入(int[]a){
int n=a.长度;
对于(int i=1;i0&&temp
有人知道这里可能有什么问题吗

当您将阵列放大10倍时,您必须等待100倍的时间,因为这是一个O(n^2)算法

执行者是否在理解这么多整数时遇到问题,或者问题的根源是什么

不,限制是2^31-1,你离限制还有很长的路要走

运行

interface A {
    static void main(String[] a) {
        for (int i = 25_000; i <= 10_000_000; i *= 2) {
            Random r = new Random();
            int[] arr = new int[i];
            for (int j = 0; j < i; j++)
                arr[j] = r.nextInt();
            long start = System.currentTimeMillis();
            insertion(arr);
            long time = System.currentTimeMillis() - start;
            System.out.printf("Insertion sort of %,d elements took %.3f seconds%n",
                    i, time / 1e3);
        }
    }

    public static void insertion(int[] a) {
        int n = a.length;

        for (int i = 1; i < n; i++) {
            int j = i - 1;
            int temp = a[i];

            while (j > 0 && temp < a[j]) {
                a[j + 1] = a[j];
                j--;
            }
            a[j + 1] = temp;
        }
    }
}

因此,我的机器可能需要4个小时,但可能需要更长的时间,因为更大的数据集不适合三级缓存,而是更慢的主存。

j>0
替换为
j>=0
我想5个小时还不够,这可能仅仅是因为100万和1000万之间存在显著差异。简单地遍历100万个元素的数组(无while循环)与1000万个元素的数组(无while循环)的速度有多快?不要忘记最坏的情况是
O(n^2)
,这意味着在这种情况下
10^14
。你能想象这个数字吗?每次你把阵列放大10倍,你就得留出100倍的时间。我猜你等的时间不够长。
Insertion sort of 25,000 elements took 0.049 seconds
Insertion sort of 50,000 elements took 0.245 seconds
Insertion sort of 100,000 elements took 1.198 seconds
Insertion sort of 200,000 elements took 4.343 seconds
Insertion sort of 400,000 elements took 19.212 seconds
Insertion sort of 800,000 elements took 71.297 seconds