Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;带尾部递归的快速排序_C++_Sorting_Recursion_Quicksort_Tail Recursion - Fatal编程技术网

C++ C++;带尾部递归的快速排序

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; }

嘿,伙计们

我在C++中遇到了Quasr排序问题。在最坏的情况下,对于一个排序数组(无论是递增还是递减值),我在大约900个元素的数组中得到一个stackoverflow。尾部递归是我找到的一个解决方案,但我可能在这里没有做到,因为我没有取得任何改进:

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;
        }
    }
}