C++ 我有一张存储在内存中的表格。如何根据列对其进行排序?

C++ 我有一张存储在内存中的表格。如何根据列对其进行排序?,c++,algorithm,sorting,C++,Algorithm,Sorting,我有一个存储在连续内存中的表。排序后需要保持该格式 例如: int table[5][3] = { { 60, 5, 10 }, { 0, 200, 15 }, { 55, 50, 365 }, { 4, 7, 78 }, { 555, 8, 11 }, }; 除了更大之外(最大的大小,以字节为单位,大约为27KB)。每个单元格始终是一个int32,所有行的列数都相同 假设我想根据第一列对其进行排序,因此结果必须等于: { 0, 200, 15

我有一个存储在连续内存中的表。排序后需要保持该格式

例如:

int table[5][3] = {
    { 60, 5, 10 },
    { 0, 200, 15 },
    { 55, 50, 365 },
    { 4, 7, 78 },
    { 555, 8, 11 },
};
除了更大之外(最大的大小,以字节为单位,大约为27KB)。每个单元格始终是一个int32,所有行的列数都相同

假设我想根据第一列对其进行排序,因此结果必须等于:

    { 0, 200, 15 },
    { 4, 7, 78 },
    { 55, 50, 365 },
    { 60, 5, 10 },
    { 555, 8, 11 },
最好的方法是什么?我想有一种更好的方法,可以将其转换为
std::list
,调用
sort()
,然后再转换回来


还有,C++中的一些东西,我只需要调用一些函数就可以了。

< P>我个人会编写一个简单的类,比如冒泡排序来代替我,而不是使用排序、转换回来。 对于冒泡排序,您只需在表格中循环查看一行中的数据及其前面的行,然后在a>b等情况下切换它们,冲洗并重复,直到您的数据被排序。这不是最有效的方法,但它在小数据集上简单而快速。

是的,使用如此大的项目进行排序往往很慢,因为复制大项目很慢

您可以(可能)通过创建一个包含键(用于排序的第一列中的项)和指向原始数据行的指针或索引的索引来加快排序速度。对索引进行排序,然后使用该索引按排序顺序将数据复制到新数组中(如有必要,还可以复制回原始数组)。这有助于将复制减少到最低限度,如果您有很多列,则可以节省相当多的时间


OTOH,考虑到您只讨论几十KB(或更多)的数据,只需直接在表上使用
qsort
(使用合适的比较函数),您就可以非常轻松地获得数据。这是一个罕见的情况,在C++中使用<代码> qStase可能是有意义的。由于Steve Jessop已经更正了显示此方法的答案,因此我将把它留给他,而不是在这里显示。

std::sort
不容易做到,因为数组是不可分配的

但是,
std::qsort
可以:

int cmp_first_column(const void *lhs_, const void *rhs_) {
    // optimize this to taste
    const int *lhs = static_cast<const int*>(lhs_);
    const int *rhs = static_cast<const int*>(rhs_);
    if (lhs[0] < rhs[0]) return -1;
    if (lhs[0] > rhs[0]) return 1;
    return 0;
}

std::qsort(table, 5, 3*sizeof(int), cmp_first_colum);
int-cmp\u第一列(const-void*lhs\u,const-void*rhs\u){
//根据口味对其进行优化
常量int*lhs=静态施法(lhs);
常数int*rhs=静态(rhs)转换;
if(lhs[0]rhs[0])返回1;
返回0;
}
标准::qsort(表5,3*sizeof(int),cmp_第一列);
好的,
std::qsort
虽然不能从模板内联优化中获益,但它可以完成任务,至少不会分配大量内存和进行不必要的复制


您可以将
int[3]
数组替换为一个结构数组,并将
int[3]
作为数据成员。这将是可分配的,您可以正常使用
std::sort
。取决于您编写了多少依赖于当前类型的其他代码,以及是否可以破坏代码使用的接口。

我认为这对大量数据来说会更糟。嗯……为了降低代码的效率而进行额外的工作并不是对时间的最佳利用。我不建议对大量数据使用这种方法,但这种排序方法需要大约5分钟的时间来实现,作为一种快速简单的解决方案,冒泡排序可以很好地处理小数据集。@Purplegoldfish:选择排序比冒泡排序更容易实现,尤其是在这种情况下,它的启动速度可能要快得多。使用
qsort
的代码更简单、更快速。@Purplegoldfish:5
5分钟的程序员有一种趋势,即使对于简单的众所周知的问题,包括调试,也会花费5小时。你自己检查一下,我的原始猜测是实现简单的BS将花费不少于半个小时:-)正如我(现在已删除)的回答一样,这实际上不会编译。
sort
算法将尝试执行对数组类型不合法的赋值。@Oli Charlesworth:是的--我相信我已经解决了这个问题。
INT\u MAX-(-1)
可能是负数,但是
INT\u MAX
大于
-1
?50%的可能投入,咕哝抱怨。当然,如果将值限制在+/-INT_MAX/2.50%的可能输入范围内也可以?我觉得你有点夸张了。问题只出现在特定的值组合中。即使(非常不现实的)假设值随机分布在整个整数范围内,问题也只出现了不到一半的时间。这并不是说代码很好(这就是我删除它的原因),但它也没有像您暗示的那样经常出现问题。小心:将数组放置在结构中可能会引起对齐问题,并且数组不会像OP要求的那样在内存中连续。我的意思是,在这种特殊情况下,它可能会起作用,但我不会在数组或字符上应用这种方法。@Kris:这就是为什么我说必须打破当前代码使用的接口——如果可能的话,我建议更改所涉及的数据结构的定义。就我个人而言,我不会尝试在数组的顶部键入pun结构数组,即使它们恰好在我的机器上具有相同的布局。