C++ C++;带尾部递归的快速排序
嘿,伙计们 我在C++中遇到了Quasr排序问题。在最坏的情况下,对于一个排序数组(无论是递增还是递减值),我在大约900个元素的数组中得到一个stackoverflow。尾部递归是我找到的一个解决方案,但我可能在这里没有做到,因为我没有取得任何改进:C++ C++;带尾部递归的快速排序,c++,sorting,recursion,quicksort,tail-recursion,C++,Sorting,Recursion,Quicksort,Tail Recursion,嘿,伙计们 我在C++中遇到了Quasr排序问题。在最坏的情况下,对于一个排序数组(无论是递增还是递减值),我在大约900个元素的数组中得到一个stackoverflow。尾部递归是我找到的一个解决方案,但我可能在这里没有做到,因为我没有取得任何改进: void quickSort(int *array, int start, int end){ //elementary state if (start + 1 > end){ return; }
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
接下来,我将返回添加到上一次调用quickSort中,作为第一个示例。我不认为这是在做什么,虽然
编辑:
int分区(int*数组、int开始、int结束){
//分割边界
int wall=开始;
对于(int i=墙;i 如果(array[i]为了避免堆栈溢出,代码需要比较分区大小,(wall-start)和(end-wall),在较小的分区上递归,然后在较大的分区上循环。这不是真正的尾部递归。类似这样:
void quickSort(int *array, int start, int end){
while(start < end){
wall = partition(...); // wall = index to pivot
// recurse on smaller part, loop on larger part
if((wall - start) <= (end - wall)){
quickSort(a, start, wall-1);
start = wall+1;
} else {
quickSort(a, wall+1, end);
end = wall-1;
}
}
}
void快速排序(int*数组、int开始、int结束){
while(开始<结束){
墙=分区(…);//墙=轴的索引
//小部分递归,大部分循环
如果((wall-start)第一个递归调用不在尾部位置,使用不同的轴选择方法可能会做得更好。(~900个调用对于每个调用不应超过20字节的堆栈来说听起来很小。)@MikelF代码以随机填充的速度完美运行arrays@molbdnilo那么,我需要在第一次快速排序调用之前再次返回?这不会阻止我的第二次调用吗?这会阻止,是的。你不能写一个“完全”尾部递归快速排序,因为递归不是线性的,而是二叉树结构。您的分区函数已损坏。请参阅示例。单独测试。使用小型系统测试用例,而不是随机数据。
void quickSort(int *array, int start, int end){
while(start < end){
wall = partition(...); // wall = index to pivot
// recurse on smaller part, loop on larger part
if((wall - start) <= (end - wall)){
quickSort(a, start, wall-1);
start = wall+1;
} else {
quickSort(a, wall+1, end);
end = wall-1;
}
}
}