C中的钻石阵列排序

时间:2013-06-22 06:53:22

标签: c arrays algorithm sorting memory

我在C中有以下作业。我基本上需要一种方法而不是解决方案。

我们有一个13 x 13阵列。在阵列中,我们需要考虑钻石形状。钻石之外的所有东西都被初始化为-1(不重要)。示例5下面的x 5数组 -

x x 1 x x 
x 2 2 2 x
3 3 3 3 3
x 4 4 4 x
x x 5 x x

x=-1

现在在这个数组中,每个条目的菱形中的值包含11位。 5 lsb包含一个数据(色调),另外6个包含另一个数据(直径)。我们需要按行顺序对数据进行排序,对色调进行单调排序,然后逐列地对直径进行单调排序。

这样做最有效和最节省内存的方法是什么?由于我们需要保存这一点,因此如果条目被交换而不是创建另一个数组,那么它是最好的。最后,我们将得到一个排序的钻石阵列(仍然是-1s)。非常感谢你们!

3 个答案:

答案 0 :(得分:1)

我不明白你想要如何重新排序元素

  

逐行,单调为色调,然后逐列为直径,单调

但是这里有一些你可以使用的想法。

  • 您的阵列是13x13(169个元素);除此之外,几乎正好一半(84)是空的,因此您可以将它们用作临时存储(例如radix-sort)。
  • 您的值有11个有意义的位;实际计算机中的数字有16位或32位 - 因此您可以使用5(或21,取决于您的系统)最重要的位作为临时存储。
  • 使用高5位的一种可能的好方法是在那里放置5 LSB(色调)的副本。当进行正常的整数比较(使色调比直径更重要)时,这将颠倒两部分的重要性

答案 1 :(得分:0)

我明白了 我想这样的钻石形状可以直接用数组表示 忽略所有 -1 条目。

{ row-0 row-1 row-2 row-3 ... row-13 }

{ 1 2 2 2 3 3 3 3 3 4 4 4 5 }

您现在可以根据需要对数组进行排序 将其分类两次,一次为色调,一次为直径;或弄清楚如何按两个标准对数组进行排序。

如果您只是编写一个将数组索引转换为菱形坐标的函数,您也可以就地工作。完成后,您可以像处理数组一样处理菱形结构。

答案 2 :(得分:0)

用这个原型写一个排序例程:

void sort(int startx, int starty, int dx, int dy, int count, int (*compare)(int, int));

void sort(int *start, int stride, int count, int (*compare)(int,int));

编写几个比较函数,并在两个for循环中调用sort,一个用于行,另一个用于列。