【问题标题】:Diamond array sorting in CC中的菱形数组排序
【发布时间】:2013-06-19 08:19:07
【问题描述】:

我在 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)。非常感谢你们!

【问题讨论】:

  • 另一项家庭作业...先生,您尝试了什么?
  • 随机化所有值,然后检查它们是否符合您的要求。如果他们不这样做,请重复该过程,直到他们这样做。 en.wikipedia.org/wiki/Bogosort
  • @xaxxon "如何有效地检查值是否已排序?"
  • 你能举个例子输入解决方案吗?特别是,如果您关心钻石的任何两个元素,色调会“取代”直径吗?例如,假设我们将一个元素表示为(hue, diameter)(为简单起见,假设它们只是数字)那么我们有(1, 1000) < (2, 0)吗?说你从上到下,在给定的行内,从左到右枚举钻石的元素是否合适?如果是这种情况,那么我只需编写一个比较器函数并将钻石排序为数组;或者您可以选择按色调排序,然后按直径对每一行进行排序。

标签: c arrays algorithm sorting memory


【解决方案1】:

我不明白您究竟想如何重新排序元素

按行,单调地表示色调,然后按列表示直径,单调

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

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

【讨论】:

  • 感谢 anatolyg,这是一个非常有用的提示,可以将另一半用作存储空间。我会试一试,然后回复你们。感谢您的支持!
【解决方案2】:

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

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

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

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

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

【讨论】:

  • 我想我有。我首先按列对它们进行了排序-
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2011-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-28
    • 1970-01-01
    • 2012-10-16
    相关资源
    最近更新 更多