[英]Stackoverflow error in my quicksort implementation
我通過在構造類實例時給布爾值insertSort提供true或false來擴展我的代碼,並選擇額外的插入排序算法。 但是當我執行我的代碼時,我得到Stackoverflow錯誤。 代碼如下:
import java.util.Random;
/**
* Write a description of class QuickSort1 here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class QuickSort1 implements IntSorter
{
private int[] v;
private Random randomGenerator;
private boolean insertionSort;
private InsertionSort insertionSorter;
public QuickSort1(boolean useInsertionSort)
{
randomGenerator = new Random();
insertionSort = useInsertionSort;
if(insertionSort)
insertionSorter = new InsertionSort();
}
public void sort(int[] v)
{
this.v = v;
if(this.v.length > 0) {
quickSort(this.v, 0, this.v.length-1);
}
else {
return;
}
}
private void quickSort(int[] v, int first, int last)
{
final int startInsertion = 20;
int First = first;
int Last = last;
int pivot = v[randomGenerator.nextInt(v.length)];
if(Last-First<2 && !insertionSort)
return;
else if(insertionSort) {
if(pivot >= Last-startInsertion)
v = insertionSorter.sort(v);
}
else {
while(First <= Last) {
while(v[First] < pivot) {
First++;
}
while(v[Last] > pivot) {
Last--;
if(Last==0)
break;
}
if(First<=Last) {
int temp = v[First];
v[First] = v[Last];
v[Last] = temp;
First++;
Last--;
}
}
if(first < Last
)
quickSort(v, first, Last);
if(First < last)
quickSort(v, First, last);
}
}
public boolean getInfo()
{
return insertionSort;
}
}
對於替代插入算法,我實現了一個帶有以下代碼的簡單類:
/**
* Write a description of class InsertionSort here.
*
* @author (your name)
* @version (a version number or a date)
*/
public class InsertionSort
{
int[] v;
/**
* Constructor for objects of class InsertionSort
*/
public InsertionSort()
{
}
public int[] sort(int[] v)
{
for(int i=1;i<v.length;i++) {
int temp = v[i];
int j;
for(j=i-1;j>=0 && temp<v[j];j--) {
v[j+1] = v[j];
}
v[j+1] = temp;
}
return v;
}
}
我現在為大小為10.000-100.000元素的數組執行此算法所獲得的錯誤消息如下:
java.lang.StackOverflowError
at java.util.Random.nextInt(Random.java:307)
at QuickSort1.quickSort(QuickSort1.java:40)
at QuickSort1.quickSort(QuickSort1.java:68)
第68行的錯誤很多次在終端中被重新分配,並且它在quickSort方法的第一次遞歸調用中指示。 線40表示由Java的隨機化int生成器決定樞軸元素的行。
我有一種強烈的感覺,這個算法可能不會比現在更好,因為對於更多的元素,堆棧將在執行期間變為空,以便對大量元素進行排序,因此我可能得到StackOverflowError。 但也許你對這個問題有另一種看法?
在此先感謝幫助我解決這個問題:D
所以我們走了。 我嘗試了一個陣列大小為1,000,000的代碼,那里有2GB內存還不夠。 所以最后答案對你來說並不令人滿意,但要指出問題可能是一個夜間計划。 但我認為斯特凡·曼德爾擊敗了神經,所以如果你有興趣,可以隨意調查這個方向。 但現在我不會讓你這樣。 我做了你的功課。 這甚至與常規堆大小一起工作。 這是一個如何增加堆的示例。 您只需要-Xmx1024即可將RAM增加到1 GB。
public class QuickFooBar {
public static void main(String[] args) {
Random random = new Random();
int[] arr = new int[1000000];
for (int i = 0; i < arr.length; ++i) {
arr[i] = random.nextInt(1000000);
}
QuickSort1 test;
test = new QuickSort1(false);
test.setV(arr);
test.quickSort(0, arr.length - 1);
arr = test.getV();
for (int i = 0; i < arr.length; ++i) {
System.out.println(arr[i] + ", ");
}
}
}
public class QuickSort1 {
private int[] arr;
private final boolean insertionSort;
public QuickSort1(final boolean insertionSort) {
this.insertionSort = insertionSort;
}
public void quickSort(int left, int right) {
final int startInsertion = 20;
if (insertionSort) {
if (((left + right) / 2) >= right - startInsertion) {
arr = new InsertionSort().sort(arr);
return;
}
}
int index = partition(left, right);
if (left < index - 1) {
quickSort(left, index - 1);
}
if (index < right) {
quickSort(index, right);
}
}
private int partition(int left, int right) {
int i = left, j = right;
int tmp;
int pivot = arr[new Random(right).nextInt()];
while (i <= j) {
while (arr[i] < pivot) {
i++;
}
while (arr[j] > pivot) {
j--;
}
if (i <= j) {
tmp = arr[i];
arr[i] = arr[j];
arr[j] = tmp;
i++;
j--;
}
};
return i;
}
public boolean getInfo() {
return insertionSort;
}
public int[] getV() {
return arr;
}
public void setV(int[] v) {
this.arr = v;
}
}
public class InsertionSort {
public int[] sort(int[] v) {
for (int i = 1; i < v.length; ++i) {
int temp = v[i];
int j;
for (j = i - 1; j >= 0 && temp < v[j]; j--) {
v[j + 1] = v[j];
}
v[j + 1] = temp;
}
return v;
}
}
public int[] sort(int[] v) {
for (int i = 1; i < v.length; ++i) {
int temp = v[i];
int j;
for (j = i - 1; j >= 0 && temp < v[j]; j--) {
v[j + 1] = v[j];
}
v[j + 1] = temp;
}
return v;
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.