Having some problems implementing quicksort in java. I get a stackoverflow error when I run this program and I’m not exactly sure why. If anyone can point out the error, it would be great.
si is the starting index. ei is the ending index.
public static void qsort(int[] a, int si, int ei){ //base case if(ei<=si || si>=ei){} else{ int pivot = a[si]; int length = ei - si + 1; int i = si+1; int tmp; //partition array for(int j = si+1; j<length; j++){ if(pivot > a[j]){ tmp = a[j]; a[j] = a[i]; a[i] = tmp; i++; } } //put pivot in right position a[si] = a[i-1]; a[i-1] = pivot; //call qsort on right and left sides of pivot qsort(a, 0, i-2); qsort(a, i, a.length-1); } }
Advertisement
Answer
First you should fix the bounds of the qsort recursive call as suggested by Keith, since otherwise you’re always sorting the whole array over and over again. The you must adjust your partition loop: j is an index, going from the beginning of the subarray to the end of it (including the last element). So you must loop from si + 1 to ei (including ei).
So this is the corrected code. I ran a few test cases and it seems to sort just fine.
public static void qsort(int[] a, int si, int ei){ //base case if(ei<=si || si>=ei){} else{ int pivot = a[si]; int i = si+1; int tmp; //partition array for(int j = si+1; j<= ei; j++){ if(pivot > a[j]){ tmp = a[j]; a[j] = a[i]; a[i] = tmp; i++; } } //put pivot in right position a[si] = a[i-1]; a[i-1] = pivot; //call qsort on right and left sides of pivot qsort(a, si, i-2); qsort(a, i, ei); } }