c++ - 从同一点恢复类方法而不使用 goto
问题描述
我正在制作逐步显示各种排序算法的程序。为此,每个算法都有自己的类和 nextStep 方法,它们应该只执行一次交换。问题是系统的实现,它允许从上一个 nextStep 调用结束的同一位置恢复排序。我试图通过使用 if 语句来解决这个问题,但没有成功。我发现的唯一工作方式是 goto。我正在寻找任何提示如何在不使用它的情况下解决此问题。
class QuickSort
{
int r;
int l;
int i;
int j;
int top;
int p;
bool swap = true;
int x;
int recoveryController;
std::vector<int> stack = std::vector<int>(1);
public:
QuickSort(std::vector<int> numbers);
void nextStep(std::vector<int> &numbers);
};
QuickSort::QuickSort(std::vector<int> numbers) {
l = 0;
r = numbers.size()-1;
stack.resize((r - l + 2));
top = -1;
stack[++top] = l;
stack[++top] = r;
recoveryController = 0;
}
void QuickSort::nextStep(std::vector<int>& numbers)
{
switch (recoveryController) {
case 1:
recoveryController = 0;
goto return1;
break;
case 2:
recoveryController = 0;
goto return2;
break;
}
while (top >= 0) {
r = stack[top--];
l = stack[top--];
x = numbers[r];
i = (l - 1);
j = l;
for (j; j <= r - 1; j++) {
if (numbers[j] <= x) {
i++;
if (i != j) {
//Custom swap function
swapData(numbers[i], numbers[j]);
recoveryController = 1;
return;
return1:
swap = false;
}
}
}
if (i + 1 != r) {
//Custom swap function
swapData(numbers[i + 1], numbers[r]);
recoveryController = 2;
return;
return2:
swap = false;
}
p=i + 1;
if (p - 1 > l) {
stack[++top] = l;
stack[++top] = p - 1;
}
if (p + 1 < r) {
stack[++top] = p + 1;
stack[++top] = r;
}
if (swap)
{
return;
}
}
}
解决方案
推荐阅读
- javascript - 如何将通配符与 Firestore 侦听器一起使用?(在快照上)
- json - 在 elasticsearch 和 Kibana 中导入 .log 文件
- c - 在 fread() 和 fwrite() 库调用期间是否发送了中断信号?
- c - BST 中的二叉搜索树
- java - 获取最后一个元素之前的经纬度
- angular - Azure 构建失败,“ng”无法识别
- javascript - 尝试使选项卡工作时无法读取 null 的属性“addEventListener”
- ios - 自定义导航栏 Swift
- linux - Docker 镜像和容器存储在哪个文件(或路径)中?
- python - 从 taglist 中删除所有内容