因此,我已正确编写了插入排序代码,使其可以成功创建介于1000和9,999之间的10、1,000、100,000和1,000,000整数的数组,并很好地完成了插入排序算法。但是,当我尝试执行10,000,000个整数的最后一步时,将创建该数组,但是代码从未完全完成。我已经花了足够的时间来完成这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;
}
}
答案 0 :(得分:2)
有人对这里可能存在的问题有任何想法吗?
当数组增大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;
}
}
}
打印
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
所以我的机器可能要花4个小时左右的时间,但是可能会花更长的时间,因为较大的数据集不适合L3高速缓存,而是主内存更慢。