我正在尝试根据其中一个对象属性对对象进行排序。每个Object都有一个与之关联的整数值。我试图使用bubblesort按降序对数组进行排序,但它似乎没有做任何事情。这是我尝试过的:
void Database::sort (vector<Play*> &vec) {
for (int i = 0; i < (vec.size() - 1); i++) {
if (vec.at(i)->getRelevance() < vec.at((i + 1))->getRelevance()) {
Play *tempObj = new Play(vec.at(i));
vec.at(i) = vec.at((i +1));
vec.at((i + 1)) = tempObj;
}
}
}
getRelevance()是按对象排序的属性。
答案 0 :(得分:3)
您的代码存在的一个问题是它只包含一个循环!如果要进行冒泡排序,则需要两个嵌套循环。例如,这可能会起作用:
void Database::sort (vector<Play*> &vec) {
bool have_swapped = true;
for (unsigned j = 1; have_swapped && j < vec.size(); ++j) {
have_swapped = false;
for (unsigned i = 0; i < vec.size() - j; ++i) {
if (vec[i]->getRelevance() < vec[i + 1]->getRelevance()) {
have_swapped = true;
Play * tempObj = vec[i]; // Just use:
vec[i] = vec[i + 1]; // std::swap(vec[i], vec[i + 1]);
vec[i + 1] = tempObj; // instead of these three lines.
}
}
}
}
你看到外环?它有两个用途。一,它实际上确保我们正在通过向量进行梳理,同时仍然存在无序元素(在算法教科书中称为反转,我相信)和两个,它让我们无法通过无意义的检查由于之前的内部循环迭代,已经“冒泡”到向量末尾的元素。
但冒泡排序不是一个好算法(除非您确定您的输入数据几乎已经排序,在这种情况下,冒泡排序可能非常有效。)相反,您可以这样做:
std::sort (vec.begin(), vec.end(),
[](Play * a, Play * b){return b->getRelevance() < a->getRelevance();}
);
这就是它。
一些注意事项:
<algorithm>
。std::sort
默认按升序排序(?),当b
的相关性小于a
时,lambda将返回true第