Hy persons,C++ quicksort с хвостовой рекурсией
У меня возникли проблемы с quicksort в C++. В худшем случае с отсортированным массивом (с растущими или уменьшающимися значениями) я получаю stackoverflow в массивах с ~ 900 элементами. Хвостовая рекурсия была решением я нашел, но им, вероятно, не сделать это прямо здесь, так как им не achiving никаких улучшений:
void quickSort(int *array, int start, int end){
//elementary state
if (start + 1 > end){
return;
}
//partitioning, retuns position of pivotelemnt
int wall = partitioning(array, start, end);
//recursion
quickSort(array, start, wall-1);
//tail recursion?
return quickSort(array, wall + 1, end);
}//quickSort
После this Wikipedia article я просто добавил возвращение к моему последнему вызову QuickSort в качестве первого примера там. Я не думаю, что это делать что-нибудь, хотя ...
редактировать:
int partitioning(int *array, int start, int end){
//partitioningborder
int wall = start;
for (int i = wall; i < end; ++i){
if (array[i] <= array[end]){
//swap an element if needed
int swap = array[i];
array[i] = array[wall];
array[wall] = swap;
//increment the partitioningborder
wall++;
}//if
}//for
//place pivotelement
int swap = array[end];
array[end] = array[wall];
array[wall] = swap;
return wall;
}//partitioning
Первый рекурсивный вызов не находится в положении хвоста. Вы можете сделать лучше с другим методом выбора. (~ 900 звонков звучит как очень мало для того, что не должно превышать 20 байт стека за звонок.) – molbdnilo
@MikelF Код отлично работает в случайно заполненных массивах –
@molbdnilo, так что мне нужно еще одно обратное проникновение моего первого quickSort позвонить тогда? Разве это не помешало бы моему второму быть вызванным? –