排序a,b,c等同于排序c;排序b;排序?

时间:2013-10-31 16:48:14

标签: c++ sql excel ms-access dataset

在C ++中,我必须实现“Excel / Access-like”(引用)查询构建器,以允许自定义数据集的排序。如果使用查询构建器在Excel中按列A,B和C排序,或者在SQL中按“ORDER BY a,b,c”排序,则按顺序获取所有As,每个组中的所有B按顺序排列,并且按顺序排列每组相同B中的所有C,这是大多数人通过“按a,b,c排序/排序”所理解的。这似乎与“按c排序”,然后“按b排序”,然后“按a排序” - 即。只需使用stable_sort,就可以按相反顺序对每列进行单独排序。这是我在我的程序中实现它的方式。用户说“按a,b,c排序”,程序通过c执行stable_sort,通过b执行stable_sort,使用相同的结果运行stable_sort,使用到目前为止我使用过的所有数据集。我的问题是,这是一个众所周知的等价,适用于任何数据集(提供了一个稳定的排序算法)和列的任意组合,甚至还有一个数学证明吗?到目前为止,我还没有通过谷歌或其他方式(询问程序员,统计学家和数学家)找到任何此类证据。

1 个答案:

答案 0 :(得分:4)

是的,这是正确的。 “证据”是稳定排序的定义:

  

如果有两个记录R和S具有相同的密钥,并且R出现在原始列表中的S之前,则排序算法是稳定的,那么R将始终出现在排序列表中的S之前。

考虑一下您的算法实现“按a排序,然后按b”排序b,然后按a排序。第一种排序(在b上)使所有记录的b低于b的记录,因为它是排序算法(稳定性第一种要求。

第二种排序(在a上)只有在b s相同时才必须注意a。由于是 stable ,这种排序的记录具有相同的a s,其顺序与排序前相同 - 即按b排序。这正是您按a排序,然后按b排序时所实现的目标。

通过观察添加更多排序步骤以保持原始顺序中的先前步骤的结果,这可以扩展到对两个以上键的排序相同的证明,这正是我们想要在相等组中的顺序。排序优先级较高的键。