如何对一串2D数组进行排序

时间:2009-08-15 07:36:07

标签: c++

我有一个p q的二维数组。我想在m n的二维数组中对这个数组进行排序,其中p> m和p = km,q> n和q = kn 其中k是整数。 例如 我有16 * 16的数组,我把它分成4 * 4的2d数组现在我想独立排序这些4 * 4数组。 我可以使用哪种算法对这些进行排序,而不使用额外的内存。

3 个答案:

答案 0 :(得分:1)

如果您编写一个专门的迭代器,您可以使用常规的STL排序算法,该迭代器可以按您希望的方式寻址您的阵列。更相关的问题是:您想如何订购2D子阵列?先决定这一点;这将告诉您如何编写适当的迭代器。

答案 1 :(得分:0)

如果要对子矩阵进行排序,则必须提供某种关系运算符(例如,比较所有元素的总和)和要排序的顺序(例如,从左到右,然后自下而上)

假设你有两个;-)为了最大限度地减少内存使用,你可以使用任何基于交换的排序算法,好的旧的quicksort会做。但是,总是需要为子矩阵的单个元素提供额外的空间。您唯一需要注意的是实际的交换操作,它必须通过elemnt交换elemnt而不是通过完整的临时子矩阵:

// swap sub matrix holding elements of T at position a with b
void swap(Matrix m, int ax, int ay, int bx, int by) {
for (int x=0; x<m; x++)
    for (int y=0; y<m; y++) 
        std::swap(m[a+x][a+y], m[b+x][b+y])
}

你可以在任何地方找到很多快速排序的实现,例如: G。 http://en.wikipedia.org/wiki/Quicksort

答案 2 :(得分:0)

如果您希望排序绝对是最少的额外内存使用量,那么保证最坏情况的排序时间,那么堆排序是最佳选择。 http://en.wikipedia.org/wiki/Heapsort

如果你的矩阵很大,你可能也想看看介绍排序。它比heapsort运行得更快,并且内存要求也保证很低(但不低于heapsort)。

一旦数组大于处理器缓存,Intro-sort比堆排序快得多。它也是大多数STL实现的默认排序算法,因此您可能已经在硬盘上有一个很好的实现。