【发布时间】:2018-07-03 13:36:48
【问题描述】:
我正在尝试使用浮动的测试类来实现快速排序版本。当我尝试生成大小为 10⁸ 的数组时,在运行我的测试类时会出现堆栈溢出。
我尝试了 10⁷ 的数组大小,效果很好
在我的测试类中,我生成了两个完全相同的数组,一个使用我的算法排序,一个使用 javas Arrays.sort() 排序。
这是我的测试类的样子。
package Quicksort;
import org.junit.Before;
import org.junit.Test;
import java.util.Arrays;
import static org.junit.Assert.*;
public class QuickSortTest {
private static float[] quickSort, javaSort;
private final static int SIZE = (int) 1e7;
@Before
public void init(){
System.gc();
quickSort = new float[SIZE];
javaSort = new float[SIZE];
for(int i = 0; i < SIZE; i++){
int temp = (int) (Math.random() * 1000) + 1;
quickSort[i] = temp;
}
javaSort = quickSort;
}
@Test
public void testQuickSort(){
QuickSort.sort(quickSort);
Arrays.sort(javaSort, 0, SIZE);
assertArrayEquals(quickSort, javaSort, .0f);
}
}
快速排序实现:
private static void quickSort(float[] table, int first, int last){
if(first < last){
int pivotIndex = partition(table, first, last);
quickSort(table, first, pivotIndex - 1);
quickSort(table, pivotIndex + 1, last);
}
}
public static int partition(float[] table, int first, int last){
sort3(table, first, last);
swap(table, first, (first + last) / 2);
float pivot = table[first];
int up = first;
int down = last;
do{
while((up < last) && table[up] <= pivot){
up++;
}
while(table[down] > pivot){
down--;
}
if(up < down){
swap(table, up, down);
}
}while(up < down);
swap(table, first, down);
return down;
}
【问题讨论】:
-
你需要发布
QuickSort的实现 -
第一次递归调用时堆栈溢出。
-
我喜欢您的测试断言:在测试准备中,您确保
javaSort和quickSort引用相同的数组 - 因此assertArrayEquals(quickSort, javaSort, .0f);将始终成功 -
问题是您的输入数据不适合快速排序算法。您准备输入数据的方式 (
int temp = (int) (Math.random() * 1000) + 1;) 意味着您的输入仅包含从 1 到 1000 的值,但这些值包含很多次(每个值约为 1e8/1000 = 100'000 次)。这是快速排序算法最糟糕的场景之一(见en.wikipedia.org/wiki/Quicksort#Repeated_elements)
标签: java stack-overflow quicksort