开了空间后仍然出现溢出问题
来源:1-6 第一版快速排序法的问题
慕田峪1302209
2024-09-18 14:41:46
老师,我照着您在课上讲的方法开了空间,但是一运行还是报错了,请问是哪里出了问题呢?
import java.util.Arrays;
public class QuickSort {
private QuickSort() {
}
public static <E extends Comparable<E>> void sort(E[] arr) {
sort(arr, 0, arr.length - 1);
}
private static <E extends Comparable<E>> void sort(E[] arr, int l, int r) {
if (l >= r) return;
int p = partition(arr, l, r);
sort(arr, l, p - 1);
sort(arr, p + 1, r);
}
//用选择排序来“优化”快速排序算法,当n < 16时,改用插入排序而不是快速排序
public static <E extends Comparable<E>> void sort2(E[] arr) {
sort2(arr, 0, arr.length - 1);
}
private static <E extends Comparable<E>> void sort2(E[] arr, int l, int r) {
// 使用 Insertion Sort 优化
if (r - l <= 15) {
InsertionSort.sort3(arr, l, r);
return; // 注意,这里要 return!
}
int p = partition(arr, l, r);
sort(arr, l, p - 1);
sort(arr, p + 1, r);
}
private static <E extends Comparable<E>> int partition(E[] arr, int l, int r) {
// arr[l+r...j] < v; arr[j+1...i] >= v(循环不变量)
int j = l;
for (int i = l; i <= r; i++)
if (arr[i].compareTo(arr[l]) < 0) {
j++;
swap(arr, i, j);
}
swap(arr, l, j);
return j;
}
private static <E> void swap(E[] arr, int i, int j) {
E t = arr[i];
arr[i] = arr[j];
arr[j] = t;
}
//测试归并排序和快速排序的性能
public static void main(String[] args) {
int n = 50000;
Integer[] arr = ArrayGenerator.generateRandomArray(n, n);
Integer[] arr1 = Arrays.copyOf(arr, arr.length);
SortingHelper.sortTest("MergeSort", arr);
SortingHelper.sortTest("QuickSort", arr1);
arr = ArrayGenerator.generateOrderedArray(n);
arr1 = Arrays.copyOf(arr, arr.length);
SortingHelper.sortTest("MergeSort", arr);
SortingHelper.sortTest("QuickSort", arr1);
}
//测试用插入排序的快速排序算法和原快速排序算法的性能
// public static void main(String[] args){
//
// int n = 1000000;
//
// Integer[] arr = ArrayGenerator.generateRandomArray(n, n);
// Integer[] arr2 = Arrays.copyOf(arr, arr.length);
//
// SortingHelper.sortTest("QuickSort", arr);
// SortingHelper.sortTest("QuickSort2", arr2);
// }
}
SortingHelper的代码
public class SortingHelper {
private SortingHelper(){}
public static <E extends Comparable<E>> boolean isSort(E[] arr)
{
for(int i=1;i<arr.length;i++)
{
if(arr[i-1].compareTo(arr[i])>0){
return false;
}
}
return true;
}
public static <E extends Comparable<E>>void sortTest(String name,E[] arr) {
long stratetime=System.nanoTime();
if(name.equals("MergeSort"))
MergeSort.sort(arr);
else if(name.equals("QuickSort"))
QuickSort.sort(arr);
else if(name.equals("QuickSort2"))
QuickSort.sort2(arr);
long endtime=System.nanoTime();
double time=(endtime-stratetime)/1000000000.0;
if(!SortingHelper.isSort(arr))
throw new RuntimeException(name+"failed");
System.out.println(String.format("%s, n = %d : %f s",name,arr.length,time));
}
}
呢?
1回答
liuyubobobo
2024-12-21
如果你确定你的代码没有错误,请尝试继续增大空间。(比如 512m 乃至 1024m)
请确认你的机器确实还有更多的可用内存。
也请参考这个问答:https://class.imooc.com/course/qadetail/291697 (其实实验出此时会栈溢出,就已经达到这一小节的学习目的了)
继续加油!:)
相似问题