开了空间后仍然出现溢出问题

来源: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 (其实实验出此时会栈溢出,就已经达到这一小节的学习目的了)


继续加油!:)

0

算法与数据结构

波波老师5年集大成之作,算法与数据结构系统学习,考试、面试、竞赛通用

2611 学习 · 1087 问题

查看课程