我正在使用基于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.
}
答案 0 :(得分:1)
employee[3]
选择第四件事,而不是第三件事,不管需要分类多少东西。
循环
while (left < right)
将检查您告诉它检查的项目,但枢轴可能不在该范围内。
在您决定如何处理之后,您还有三个错误/事情需要考虑。
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--;
}
我相信你的左边陈述是正确的,但是你正在检查右边索引的姓氏是否小于枢轴,当你可能应该检查它是否更大。很多时候,像这样的小事会给你带来意想不到的代码流。我不认为这会解决所有问题。