【发布时间】:2017-11-24 15:04:28
【问题描述】:
我正在创建排序算法的可视化。
我有一个QGraphicsRectItems 的向量,它们是在应用程序启动时生成的具有不同高度和相同宽度的列。它们被洗牌,然后添加到QGraphicsScene。
名为“算法”的类对用于设置列高度的浮点值向量进行排序。在交换时——它向主类发出一个带有两个整数的信号,所以它看起来像这样:
emit comparison(array[first element to swap], array[second element to swap]);
主类中的Function(on_comparison) 与该信号相关联。当我试图交换这两个元素时出现了问题。我创建了一个变量来设置n 列位置。之后我试图设置列的位置,所以我做了类似的事情:
void on_comparision(int n, int k)
{
auto nColumnPos = columns[n]->pos().x();
columns[n]->setX(columns[k]->pos().x());
columns[k]->setX(nColumnPos);
}
但它不起作用。立场不变。 此外
qDebug() <<nColumnPos;
显示值 = 0。
我想知道我的整个程序是否有效,所以我决定实现 2 个排序算法,它们在彼此附近交换 2 个元素并将 on_comparison 函数修改为
columns[n]->setX(columns[n].pos().x() + columnsWidth);
columns[n]->setX(columns[n].pos().x() - columnsWidth);
它有效,但没有给出令人满意的结果。此功能仅适用于在其他元素附近交换 2 的排序算法,例如。冒泡排序/鸡尾酒排序。
我正在寻找答案,但没有发现任何有用的信息。
代码如下: https://gist.github.com/anonymous/e612e35a7c14eeb650099d4b997f437d
【问题讨论】:
-
除了.pro之外,您还必须上传文件.ui和main.cpp。
-
@eyllanesc 有一个包含所有源文件的文件夹drive.google.com/drive/folders/…
-
你说它适用于这两种算法,我看到它有效,我的问题,在什么情况下它不起作用?
-
当我尝试交换列位置时它不起作用,只是因为我真的不知道如何。正因为如此,我创建了适用于冒泡排序和鸡尾酒排序的函数,只是因为这些算法一个接一个地检查元素 1,所以这意味着如果可以交换,我只需将 n 列 pos 增加列宽,并减少 k列 pos 按列宽
-
void on_comparision(int n, int k) { auto nColumnPos = columns[n]->pos().x(); columns[n]->setX(columns[k]->pos().x()); columns[k]->setX(nColumnPos); std::swap(columns[n], columns[k]); }这是我尝试使用的功能,但列甚至没有移动。
标签: c++ algorithm qt sorting swap