快速排序算法StackOverflowError

qq_35899288 2016-09-30 09:39:20
class Quick{
public void quickSort(int[] arr,int start,int end){
int i=start;
int j=end;
int key=arr[i];
boolean bl=true;
while(i<j){
if(bl){
if(key>arr[j]){
arr[i++]=arr[j];
bl=!bl;
}
else j--;
}
else{
if(key<arr[i]){
arr[j--]=arr[i];
bl=!bl;
}
else i++;
}
}
arr[i]=key;
if(start<i-1) quickSort(arr,start,i-1);
if(i+1<end) quickSort(arr,i+1,end);
}
}

这个随机生成80万个数字没有问题,800万个就提示StackOverflowError,提示问题出现在if(i+1<end) quickSort(arr,i+1,end);
...全文
591 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
bree06 2016-10-10
  • 打赏
  • 举报
回复
将JVM内存设置大一点就行, 我这边拿递归测试1个亿的数据是没问题的. 然后做了一个改版将递归转为循环, 你可以测试一下.
public class Quick {
    static Random random = new Random();

    public static void main(String[] args) {
        Quick quick = new Quick();
        int[] array = new int[100000000];
        int r = array.length << 1;
        for (int i = 0; i < array.length; i++) {
            array[i] = random.nextInt(r);
        }
        int[] array_new = array.clone();
        long start = System.currentTimeMillis();
        quick.quickSort(array, 0, array.length - 1);
        System.out.println("quickSort: " + (System.currentTimeMillis() - start));

        start = System.currentTimeMillis();
        quick.quickSortNode(array_new);
        System.out.println("quickSortNode: " + (System.currentTimeMillis() - start));
    }

    public void quickSort(int[] arr, int start, int end) {
        int i = start;
        int j = end;
        int key = arr[i];
        boolean bl = true;
        while (i < j) {
            if (bl) {
                if (key > arr[j]) {
                    arr[i++] = arr[j];
                    bl = !bl;
                } else j--;
            } else {
                if (key < arr[i]) {
                    arr[j--] = arr[i];
                    bl = !bl;
                } else i++;
            }
        }
        arr[i] = key;
        if (start < i - 1) quickSort(arr, start, i - 1);
        if (i + 1 < end) quickSort(arr, i + 1, end);
    }

    // 改版快速排序, 将递归改为循环
    public void quickSortNode(int[] arr) {
        int len = arr.length, p = 0;
        int[][] r = new int[arr.length > 100 ? 100 : arr.length][];
        r[p++] = new int[]{0, len - 1};
        do {
            int[] point = r[--p];
            if (point[0] >= point[1]) continue;
            int key = arr[point[0]], i = point[0], j = point[1], left = i, right = j;
            boolean bl = true;
            while (i < j) {
                if (bl) {
                    if (key > arr[j]) {
                        arr[i++] = arr[j];
                        bl = !bl;
                    } else j--;
                } else {
                    if (key < arr[i]) {
                        arr[j--] = arr[i];
                        bl = !bl;
                    } else i++;
                }
            }
            arr[i] = key;
            if (left < i - 1) r[p++] = new int[]{left, i - 1};
            if (i + 1 < right) r[p++] = new int[]{i + 1, right};
        } while (p > 0);
    }
}
这是测试1亿数据用时. 递归略快. quickSort: 10416 quickSortNode: 11876
bree06 2016-10-09
  • 打赏
  • 举报
回复
将递归改为循环, 数据量大了递归就是死
sky_08_06_02 2016-10-09
  • 打赏
  • 举报
回复
pan__yy 2016-10-08
  • 打赏
  • 举报
回复
800w已经超出了栈的存储范围,将数组声明成全局变量就会存在堆内存,堆内存大很多

62,623

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧