【问题标题】:Sorting an integer circular array swapping elements with 1 in between对整数循环数组进行排序,交换元素之间的元素为 1
【发布时间】:2016-10-14 23:14:20
【问题描述】:

给定一个整数循环数组 v,其中 n > 0 个数字,唯一可能的移动“m”是将一个元素与前面 2 之后的一个元素交换。
我必须打印一系列排序 v 或说这是不可能的动作(用 c 语言)

示例:
初始值:v = [8, 0, 5, 9, -1, 5]
将 m 应用于 v[4] 后:v = [-1, 0, 5, 9, 8, 5]
将 m 应用于 v[3] 后:v = [-1, 0, 5, 5, 8, 9]
现在从它的 0 位置排序。输出将是“4 3”

到目前为止我所知道的:
- 如果有奇数个元素,您可以将任何元素移动到任何位置。 (但保证可以排序就够了吗?)
- 对于偶数个元素,并不总是可以对其进行排序,因为您不能在奇数和偶数位置之间移动元素(例如:v = [-1, -2, 1, 7],因为 -2 在是奇数位置,但应该是偶数位置)。

我一直在想这个:
- 使用辅助数组“aux”将数字与其真正的邻居放在一起,例如:
v = [8, 0, 5, 9, -1, 5, 6] -> aux = [8, 5, -1, 6, 0, 9, 5]
现在在 aux 中,我可以使用相邻的数字执行简单的交换。
- 就其在 aux 中的位置“i”而言的最终配置是:
v = [8, 0, 5, 9, -1, 5, 6] -> 辅助 = [8, 5, -1, 6, 0, 9, 5] -> i = [0, 2, 4, 6 , 1, 3, 5]
- 如果 n 是偶数,会有 2 个辅助,因为要对 v 进行排序,你不能在奇数和偶数位置之间移动数字,所以有 2 个子问题。例如:
v = [8, 0, 5, 9, -1, 5]
辅助偶数 = [8, 5, -1] -> i-偶数 = [0, 2, 4]
aux-odd = [0, 9, 5] -> i-even = [1, 3, 5](考虑 v)

我不知道从这里去哪里,或者它是否是一个很好的跑步路径。

欢迎任何想法或帮助。

编辑

我正在尝试模拟 AlexD 针对奇怪情况提出的算法:
v = [8, 0, 5, 9, -1, 5, 6]
v-排序 = [-1, 0, 5, 5, 6, 8, 9]

为它们分配键 (-1, 1), (0, 5), (5, 2), (5, 6 ), (6, 3), (8, 7), (9, 4)。

回到原来的顺序:
(8, 7) (0, 5) (5, 2) (9, 4) (-1, 1) (5, 6) (6, 3)

对中间有 1 的键使用冒泡排序。
(8, 7) (0, 5) (5, 2) (9, 4) (-1, 1) (5, 6) (6, 3)
(5, 2) (0, 5) (8, 7) (9, 4) (-1, 1) (5, 6) (6, 3)
(5, 2) (0, 5) (-1, 1) (9, 4) (8, 7) (5, 6) (6, 3)
(5, 2) (0, 5) (-1, 1) (9, 4) (6, 3) (5, 6) (8, 7)
(-1, 1) (0, 5) (5, 2) (9, 4) (6, 3) (5, 6) (8, 7)
(-1, 1) (9, 4) (5, 2) (0, 5) (6, 3) (5, 6) (8, 7)
(-1, 1) (9, 4) (5, 2) (0, 5) (6, 3) (5, 6) (8, 7)
但数字没有排序。我错过了什么?

【问题讨论】:

  • 它是圆形的,所以你可以将它向前移动两次(到第 2 位,然后到第 5 位)
  • 谢谢,@SectoKia。实际上,4 到 v[0],然后是 v[2],然后是 v[4]。

标签: c arrays algorithm sorting data-structures


【解决方案1】:

为了简单起见,我用具体的例子来说明,容易概括。

偶数情况

假设我们有 8 个元素。然后我们分别对两个子数组(具有奇数和偶数索引)进行排序,使用带有步骤 2 的冒泡排序,并且有

a1    a2    a3    a4
   b1    b2    b3    b4

如果结果数组a1 b1 a2 b2 a3 b3 a4 b4 恰好被排序,我们就完成了。否则无解。

奇数情况

假设您有 7 个元素。用你最喜欢的方法对它们进行排序。假设在排序后它们是

a5 a4 a1 a7 a3 a2 a6

像这样为每个元素分配键:

a5 a4 a1 a7 a3 a2 a6
 1  5  2  6  3  7  4

然后回到原来的顺序:

a1 a2 a3 a4 a5 a6 a7
 2  7  3  5  1  4  6

然后按新键(1 - 7)对对进行排序,使用冒泡排序,每次跳过一个元素。对键进行排序后,您的 a1 ... a7 值就会占据它们的目标位置。

我们用数组来说明

5 1 5 9 0

排序后的数组和对应的键是

0 1 5 5 9
1 4 2 5 3

现在让我们按键对对进行排序(我们每一步比较其键的对在<>中)

<5 2> (1 4) <5 5> (9 3) (0 1) // starting the first loop
(5 2) (1 4) <5 5> (9 3) <0 1>
(5 2) <1 4> (0 1) (9 3) <5 5>
(5 2) <5 5> (0 1) <9 3> (1 4)
<5 2> (9 3) <0 1> (5 5) (1 4) // (5 5) is in its final position, starting the second loop
(0 1) (9 3) <5 2> (5 5) <1 4>
(0 1) <9 3> (5 2) (5 5) <1 4>
<0 1> (1 4) <5 2> (5 5) (9 3) // (1 4) in its final position, starting the third loop
(0 1) (1 4) <5 2> (5 5) <9 3>
<0 1> (1 4) <5 2> (5 5) (9 3) // (9 3) in the final position
(0 1) (1 4) (5 2) (5 5) (9 3) // (0 1) and (5 2) are in final positions

【讨论】:

  • 感谢分享。我正在努力理解它。
  • @N.Kita 如果您有任何问题,请询问。如果我今天休息,明天会回来。
  • 我不确定我是否弄清楚了奇怪情况的排序。 ://
  • @N.Kita 让我试着解释一下。首先,是否清楚如何使用中间元素交换将奇数长度数组7 4 5 1 2 6 3 排序为1 5 2 6 3 7 4
  • 我不确定。看看我的模拟是否正确?
猜你喜欢
  • 2015-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-27
相关资源
最近更新 更多