自定义排序数组

时间:2014-02-14 19:36:30

标签: c algorithm sorting data-structures

你有一组数字。 a1, a2, a3, a4, ..., an。这些数字是随机的,可能会重复。

按顺序排列数字x1 > x2 < x3 > x4 < x5 > x6 ...

x1x3, x4, x5, ...没有任何关系,x2x4, x5,...没有任何关系,x3x1, x5, x6,...没有任何关系,因此上。

对于这个问题,可能有许多可行的解决方案,看到最终答案可以达到其中任何一个。如果输入类似于22,22,22,那么它应该输出“无可行解决方案”的消息,但是对于像7 7 7 3 3这样的输入,它应该打印出如下的解决方案:7 3 7 3 7

我的解决方案是首先按O(nlogn)对输入数组进行排序,然后用最后一个未接触的元素填充输出数组,然后用第一个未触摸的元素填充输出数组,总体为O(nlogn)。我们能做得更好吗?如何跟踪不可行的解决方案?

1 个答案:

答案 0 :(得分:1)

  • 你显然排除了平等。对于所有相同的项目不能这样安排。所以,如果某个东西等于就绪序列的当前末尾,我们就会把它扔掉。

    1. 拿a1,a2。其中有人更大。那将是第一个。
    2. 现在我们需要比最后一项更大的项目。如果下一个a大于最后一个x,则让a成为下一个x。如果下一个a小于最后一个x,则将当前a放在最后一个x位置,然后x移动到下一个位置。
    3. 与2相同,只为较小而变大,反之亦然。
    4. 回到2。
    5. 退出输入数组的结尾a。

      a:7,10,5,8,9

      x:10,7?5

      x:10,5,7?8

      x:10,5,8,7?9

      x:10,5,8,7,9

复杂性为O(n)。但你不应该忘记清理平等的物品。您可以随机选择下一个项目,同时甩掉与前一个数字相等的数字。你不需要创建一个数组。无论如何,它们都是随机的。