C中的钻石arrays排序

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

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

xx 1 xxx 2 2 2 x 3 3 3 3 3 x 4 4 4 x xx 5 xx x=-1 

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

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

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

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

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

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

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

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

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

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

使用此原型编写排序例程:

 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,一个用于行,另一个用于列。