向量排序算法,只对大于 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)
【讨论】:
这取决于你,但我想说>=
使该逻辑的意图更加明显。【参考方案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<
,因为这会引起混淆,因为游戏标题也可以用作一种合乎逻辑的排序方式)
【讨论】:
以上是关于向量排序算法,只对大于 0 的元素进行排序的主要内容,如果未能解决你的问题,请参考以下文章