问题
i implemented the Quick Sort Algorithm which given pseudo code in Introduction to Algorithms (Cormen, 3rd Edition) 7.1
When i tried algorithm with small sized arrays, result is true. But when i tried with N=50000 and array is already sorted like this; N = {1, 2, 3, ..., 50000};
It gives StackOverflowError. I think it's happening because the function recurse itself 50000 times. QuickSort(A, 0, 49999) => QuickSort(A, 0, 49998) => QuickSort(A, 0, 49997)... so go on.
Can i solve this problem? Or should i use different pivot position?
Here is my code;
public void sort(int[] arr){ QuickSort(arr, 0, arr.length - 1); }
private void QuickSort(int[] A, int left, int right){
if(left < right){
int index = Partition(A, left, right);
QuickSort(A, left, index - 1);
QuickSort(A, index + 1, right);
}
}
private int Partition(int[] A, int left, int right){
int pivot = A[right];
int wall = left-1;
for(int i=left; i<right; i++){
if(A[i] <= pivot){
Swap(A, ++wall, i);
}
}
Swap(A, wall + 1, right);
return wall + 1;
}
private void Swap(int[] A, int x, int y){
int keeper = A[x];
A[x] = A[y];
A[y] = keeper;
}
回答1:
Yes, this pivot scheme is not right choice for sorted array. It causes very unbalanced partition, leads to O(N^2) complexity and very deep recursion level, as you noticed.
There are some approaches to improve this behavior.
For example, you can use random index for pivot like pivotIdx = start + rand() % (end-start+1);
, or choose median-of-three method (median of the first, last and middle elements in index range).
P.S. An option to avoid stack overflow - call recursion for shorter segment at first, then for longer one.
https://en.wikipedia.org/wiki/Quicksort#Choice_of_pivot
来源:https://stackoverflow.com/questions/33452614/quicksort-algorithm-cormen-gives-stackoverflow