循环递归函数c ++

时间:2013-07-29 17:22:09

标签: c++ infinite-loop tail-recursion qsort

我正在使用基于employee.lastname的Qsort。
left是我们经历过多少人的反击。
emptotal,(或right)总数是多少。
因为我知道有5个我强制转轴指向3.我的问题是,在整个事件循环中的第二个递归调用,我无法弄清楚为什么它循环。它应该向上计数(或向下)然后到达终点计数器。

#include "./record.h"
#include <string.h>
#include <algorithm>

void externalSort(EmployeeRecord employee[],int empcount,int emptotal)
{
    int left=empcount,
        right=emptotal;    
    EmployeeRecord pivot = employee[3];    
    while (left < right) 
    {
        if (strcmp(employee[left].lastname, pivot.lastname) < 0 )
        {    
            left++; 
        }
        else if (strcmp(employee[right].lastname, pivot.lastname) < 0 )
        {
            right--; 
        }
        else 
        {
            std::swap(employee[left],employee[right]);
            left++;
            right--;
        }
    }

    if (strcmp(employee[left].lastname, pivot.lastname) < 0 )
    {
        std::swap(employee[left],employee[empcount]);
        left--;
    }
    if (strcmp(employee[right].lastname, pivot.lastname) < 0 )
    {
        std::swap(employee[right],employee[empcount]);
        right++;
    }

    if (empcount < right) externalSort(employee,empcount,right);
    if (left < emptotal) externalSort(employee,left,emptotal);
// The 2nd call is what seems to be looping, when I comment it out, 
    //the function doesn't loop.

}

2 个答案:

答案 0 :(得分:1)

employee[3]选择第四件事,而不是第三件事,不管需要分类多少东西。

循环

while (left < right)

将检查您告诉它检查的项目,但枢轴可能不在该范围内。

在您决定如何处理之后,您还有三个错误/事情需要考虑。

  1. 你需要交换最后一个分支吗?
  2. 当您递归时,请尝试使用externalSort(employee,empcount,pivot_index-1)
  3. 类似于externalSort(employee,left,emptotal),您需要使用pivot index + 1
  4. Wikipedia上有一些相对清晰的伪代码。你假设你每次都可以使用第3点。你递交时可能少于3个。

答案 1 :(得分:0)

我要做的第一件事就是检查以确保你的strcmp语句真正按照你认为应该做的去做。

if (strcmp(employee[left].lastname, pivot.lastname) < 0 )
{    
left++; 
}
else if (strcmp(employee[right].lastname, pivot.lastname) < 0 )
{
right--; 
}

我相信你的左边陈述是正确的,但是你正在检查右边索引的姓氏是否小于枢轴,当你可能应该检查它是否更大。很多时候,像这样的小事会给你带来意想不到的代码流。我不认为这会解决所有问题。