gpt4 book ai didi

java - 混合快速排序 + 插入排序 java.lang.StackOverflowError

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:09 25 4
gpt4 key购买 nike

我正在尝试计算混合快速排序 - 插入排序的运行时间。但是,当出现一个更大的数组(~500k 元素)时,我得到一个 java.lang.StackOverflowError。我能以某种方式克服这个吗?不使用递归不是一种选择。

代码如下:

public class QuickSort2 {

private static void swap(int[] arr, int x, int y){
int temp = arr[x];
arr[x] = arr[y];
arr[y] = temp;
}

private static int partition(int[] arr, int lo, int hi){
int pivot = arr[hi];
int index = lo - 1;
for(int i = lo; i < hi; i++){
if(arr[i] < pivot){
index++;
swap(arr, index, i);
}
}
swap(arr, index + 1, hi);
return index + 1;
}

public static void quickSort(int[] arr, int lo, int hi){
if(lo < hi && hi-lo > 10){
int q = partition(arr, lo, hi);
quickSort(arr,lo,q-1);
quickSort(arr,q+1,hi);
}else{
InsertionSort.insertSort(arr);
}
}
}

还有插入排序:

public class InsertionSort {

static void insertSort(int[] arr){
int n = arr.length;
for (int j = 1; j < n; j++){
int key = arr[j];
int i = j-1;
while ((i >= 0) && (arr[i] > key)){
arr[i+1] = arr[i];
i--;
}
arr[i+1] = key;
}
}

发生错误的行:

quickSort(arr,lo,q-1);
quickSort(arr,q+1,hi);

还有调用代码:

public class RunningTime {

public static void main(String[] args) {
int[] arr = ReadTest.readToArray("int500k");
int lo = 0;
int hi = arr.length - 1;

long startTime = System.currentTimeMillis();
QuickSort2.quickSort(arr, lo, hi);
long stopTime = System.currentTimeMillis();
long elapsedTime = stopTime - startTime;
System.out.println("Running time: " + elapsedTime);
System.out.println("Array is sorted: " + isSorted(arr));
}

最佳答案

您应该限制插入排序只对数组的子集起作用。

除此之外,我没有发现您的代码有任何其他问题。

文件 int500k 是否排序?如果是这样,这就是快速排序的最坏情况,这意味着递归将有 500k 层深。

要修复它,您可以例如随机选择枢轴而不是 arr[hi]

关于java - 混合快速排序 + 插入排序 java.lang.StackOverflowError,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54554721/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com