向量排序算法,只对大于 0 的元素进行排序

Posted

技术标签:

【中文标题】向量排序算法,只对大于 0 的元素进行排序【英文标题】:Vector Sort Algorithm, sort only elements bigger then 0 【发布时间】:2018-12-17 12:07:41 【问题描述】:

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

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 的游戏进行排序。 提前致谢。

【问题讨论】:

只对大于 0 的元素进行排序是什么意思?其他元素是否在正元素之间随机交错? 如果您真的希望零评级的项目保持在原来的位置,那么如果没有更多的工作,这是不可能的。如果您希望零评​​分项目的相对顺序保持不变,那么这是一个稳定的排序。 【参考方案1】:

您可以使用std::stable_sort 来防止在不受排序标准影响的元素之间移动。

std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)

    return info1.rating > info2.rating;
);

【讨论】:

【参考方案2】:

std::sort() 不是stable sorting algorithm,即具有等效键的元素在排序后可能不会保留它们之间的原始顺序。


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

std::stable_sort(games.begin(),games.end(), [](game& info1, game& info2)

    return info1.rating > info2.rating;
);

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

【讨论】:

【参考方案3】:

您可以使用std::stable_sort()

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

return !(info1.rating < info2.rating)

【讨论】:

这取决于你,但我想说&gt;= 使该逻辑的意图更加明显。【参考方案4】:

您可以使用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;
);

【讨论】:

【参考方案5】:

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&lt;,因为这会引起混淆,因为游戏标题也可以用作一种合乎逻辑的排序方式)

【讨论】:

以上是关于向量排序算法,只对大于 0 的元素进行排序的主要内容,如果未能解决你的问题,请参考以下文章

基础算法|5 快速排序

排序算法----桶排序(数组)

常见的php排序算法

十大排序算法—二分法插入排序

排序算法之快速排序

排序算法之插入排序