多次对向量进行排序

Posted

技术标签:

【中文标题】多次对向量进行排序【英文标题】:Sorting a vector multiple times 【发布时间】:2013-03-03 08:41:25 【问题描述】:

我必须编写一个程序来接收多行输入,然后根据给定的几个命令行参数对它们进行排序。行可以是可变长度的,行上的每个项目用逗号分隔,如下所示:

a,b,c,12,3
d,e,f,4,56
a,g,h,8,5

程序要做的是根据给定的参数对某些列上的输入进行排序。这很简单,但困难的部分是我还必须能够对多个参数进行排序。

例如,命令行参数 1,4(均升序)将输出:

a,g,h,8,5
a,b,c,12,3
d,e,f,4,56

所以它根据第一列排序,然后是第四列。我不确定如何对某些内容进行排序,然后仅使用下一个参数对冲突元素进行排序,而不使用整个列。我目前将输入存储在向量向量中。

作为旁注,我读过一些类似的问题,但它们都只有一组要排序的东西。对于这个程序,每行的项目数可以是从 1 到 1 的任意数量,并且排序依据的参数数量也可以是可变的。

【问题讨论】:

可行,只需要提供写比较功能即可。能否提供一些源代码? 您如何按第一列和第四列对a,g,h,8,6a,g,h,8,5 进行排序? a,g,h,8,6a,g,h 怎么样? @Johnsyweb 你问我还是 OP?如果我理解正确,他想要行,使用第一列作为第一个键,然后在第一列中的值相同的情况下按第四列作为第二列排序。如果你使用正确的数据结构并写一个operator<,这并不难,即使列数是可变的。 我在问@QuinnMillir。 @Stephen Lin 我会的,但是我的文件服务器今天宕机了,我丢失了当前的工作。 【参考方案1】:

首先,使用 std::sort() ,它首先与迭代器一起工作,最后作为输入。 然后,使用递归。递归是解决方案的关键。

对于每个参数,即排序标准 C_i,您有一个递归级别 R_i。在每个递归级别 R_i 中,您有两个步骤:

    根据标准 C_i 对给定的数据范围进行排序。 遍历数据范围。每当值 C_i 更改时,使用参数调用下一个递归级别 R_i+1: first:指向最后一次更改的迭代器,或者,范围的开始 last:当前元素的迭代器(C_i 改变的第一个元素) 标准列表和 i+1 的引用/指针

就是这样!

讨论这个解决方案:

由于有迭代器,这种方法很有效,因为底层数据结构不需要重新初始化、复制等。 您需要编写一个自定义的比较器函子,该函子用 i 初始化,并且始终根据向量的元素 i 进行比较。 哪个更快是有争议的:进行一次大排序,每次比较时都必须通过所有排序标准,或者像我的方法一样多次排序,每次只检查一个标准。 在这个解决方案中,很多向量被交换。不过这不是问题,因为 std::vector 交换很便宜。

【讨论】:

以上是关于多次对向量进行排序的主要内容,如果未能解决你的问题,请参考以下文章

使用整数向量的向量对整数向量进行基数排序

Armadillo C++:根据其他两个向量对向量进行排序

C++ 按列对二维向量进行排序

根据额外参数对向量进行排序

按多个条件对向量进行排序

根据关联的整数向量对字符串向量进行排序[重复]