C语言中的菱形数组排序

C语言中的菱形数组排序,c,arrays,algorithm,sorting,memory,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包含另一个数据(直径)。我们需要对数据按行排序,按色调单调排序,然后按列排序,按直径

我有以下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包含另一个数据(直径)。我们需要对数据按行排序,按色调单调排序,然后按列排序,按直径单调排序

做这件事最有效和节省内存的方法是什么?因为我们需要保留这个,所以最好是交换条目,而不是创建另一个数组。最后,我们将得到一个排序的菱形数组(仍然是-1)。提前谢谢大家

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

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

{ 1 2 2 2 3 3 3 3 3 4 4 4 5 }
现在,您可以根据需要对数组进行排序。
分类两次,一次为色调,一次为直径;或者了解如何根据两个条件对数组进行排序


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

我不明白你到底想对元素重新排序

按行,色调是单调的,然后按列,直径是单调的

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

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

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

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


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

另一个家庭作业…您尝试了什么,先生?将所有值随机化,然后检查它们是否满足您的要求。如果他们没有,重复这个过程直到他们做到@xaxxon“如何有效地检查值是否已排序?”您能给出一个示例输入和解决方案吗?特别是,如果你关心钻石的任何两个元素,色调是否会“取代”直径?例如,假设我们将一个元素表示为
(色调、直径)
(为了简单起见,假设它们只是数字),那么我们是否有
(11000)
?如果说你从上到下,从左到右列举钻石的元素,这是否合适?如果是这样,那么我只需编写一个比较器函数,并将钻石排序为数组;或者你可以选择按色调排序,然后按直径对每行进行排序。感谢anatolyg,这是一个非常有用的提示,可以将另一半用作存储。我试试看,然后再和你们联系。谢谢你的支持!我想我知道了,伙计们。我首先用-
void sort(int *start, int stride, int count, int (*compare)(int,int));