矢量排序算法,仅对大于 0 的元素进行排序

Vector Sort Algorithm, sort only elements bigger then 0

本文关键字:排序 元素 大于 算法      更新时间:2023-10-16

我必须对结构向量进行排序。假设结构有两个成员:

Struct game
{
string name;
int rating;
};

因此,我创建了一个std::vector<game>游戏,并按评级对它们进行了简单的排序。

std::sort(games.begin(),games.end(), [](game& info1, game& info2)
{
return info1.rating > info2.rating;
});

到目前为止一切都很好。 问题是,如果所有游戏的评级值均为 0,则它们混合在一起。简单地说,我必须只对评级大于零的元素进行排序。我们举个例子:

所有游戏都按字母顺序和评级 0 的名称推送到向量中,当触发排序时,字母顺序被违反。

排序前的示例:

"A_Game""B_Game""C_Game""E_Game""G_Game"等(接下所有字母)

排序后(所有游戏的评级均为 0):

"G_Game""S_Game""P_Game""M_Game""L_Game""I_Game"等。

我只需要对这些评级大于 0 的游戏进行排序。 提前谢谢。

您可以使用std::stable_sort来防止在不受排序条件影响的元素周围移动。

std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)
{
return info1.rating > info2.rating;
});

std::sort()不是一个稳定的排序算法,即具有等效键的元素在排序后可能无法保持它们之间的原始顺序。


您可以使用std::stable_sort()代替std::sort()

std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)
{
return info1.rating > info2.rating;
});

顾名思义,std::stable_sort()实现了稳定的排序算法。

您可以使用std::stable_sort().

但是,您可以继续使用std::sort()并使比较器返回具有相同评级的游戏的true(因此保留相对顺序),方法是将条件更改为

return !(info1.rating < info2.rating)

您可以使用stable_sort而不是sort。这将是该问题的最佳选择。

您还可以修改排序,以便在两个游戏具有相同的评级时,按字母顺序对两个名称进行排序(或将来可能出现的任何其他条件)。它可能看起来像这样。

std::sort(games.begin(),games.end(), [](game& info1, game& info2)
{
if (info1.rating == info2.rating)
return info1.name.compare(info2.name);
return info1.rating > info2.rating;
});

std::sort确实不保证元素比较相等时的任何排序。std::stable_sort保证如果比较相等,则保留原始顺序。(见其他答案)

当对原始顺序有疑问时,我喜欢明确地对所有标准进行排序:

std::sort(games.begin(),games.end(), [](game const & info1, game const & info2)
{
if (info1.rating != info2.rating)
return info1.rating > info2.rating;
return info1.name < info2.name;
});

在上面,我更喜欢使用以下模式

if member1 different
return compare member1
if member2 different
return compare member2
return compare member<last> OR compare pointers

添加额外成员时,此模式易于识别和扩展。

理想情况下,当您想在其他地方使用此排序时,您可以将其设置为具有明确名称的函数。(不要使用operator<因为这会导致混淆,因为游戏标题也可以用作逻辑排序方式)