Quicksort जावा के लिए StackOverFlowError जावा - जावा, quicksort

मैं एक क्विकॉर्ट कोड का परीक्षण कर रहा हूं जो मैंने लिखा था लेकिन मुझे यकीन नहीं है कि मुझे क्यों मिल रहा है

त्रुटि:

Exception in thread "main" java.lang.StackOverflowError
at java.util.ArrayList$Itr.<init>(ArrayList.java:820)
at java.util.ArrayList.iterator(ArrayList.java:814)
at practice.Quicksort.quicksort(Quicksort.java:15)
at practice.Quicksort.quicksort(Quicksort.java:25)
at practice.Quicksort.quicksort(Quicksort.java:25)
at practice.Quicksort.quicksort(Quicksort.java:25)

लाइन 15 कहाँ है:

for (int n : arr) {

और लाइन 25 है:

more = quicksort(more);

कोड:

public class Quicksort {
public static List<Integer> quicksort(List<Integer> arr) {
if (arr.size() <= 1) {
return arr;
}
List<Integer> less = new ArrayList<Integer>();
List<Integer> more = new ArrayList<Integer>();
int pivotIndex = arr.size() / 2;
int pivot = arr.get(pivotIndex);
for (int n : arr) {
if (n < pivot) {
less.add(n);
}
else {
more.add(n);
}
}
// recursively sort
less = quicksort(less);
more = quicksort(more);

// concatenate all
less.add(pivot);
less.addAll(more);
return less;
}

public static void main(String[] args) {
List<Integer> test = new ArrayList<Integer>();
int[] arr = {2,4,1,4,5,2,-10,3,0,33,23};
for (int c : arr) {
test.add(c);
}
System.out.println(quicksort(test));
}
}

उत्तर:

उत्तर № 1 के लिए 1

आपके कोड में एक मौलिक दोष है, जिससे नाम की सूची की संभावना बढ़ जाती है more दो बाद के पुनरावृत्तियों में समान होना। संभावित समस्याएं कोड के नीचे अनुभाग में हैं:

 int pivotIndex = arr.size() / 2;
int pivot = arr.get(pivotIndex);
for (int n : arr) {
if (n < pivot) {
less.add(n);
}
else {
more.add(n);
}
}

में धुरी को न जोड़ें more या less सूची। इसके अलावा, आप समझ सकते हैं कि वेरिएंट कैसे चुनें यहाँ ब्लॉग पर


उत्तर № 2 के लिए 1

सूचि more धुरी को शामिल नहीं करना चाहिए। यदि यह आपके जोखिम को चलाता है more बिल्कुल वही सूची होने के नाते जो में पारित किया गया था, और आपको एक अनंत पुनरावर्ती लूप मिलता है जब तक कि कार्यक्रम स्टैक स्पेस से बाहर नहीं निकलता है।

एक सामान्य तकनीक सूची में पहले आइटम के साथ धुरी को स्वैप कर रही है, और फिर की सूची बनाएं less तथा more दूसरे आइटम से शुरू।