对整数圆形数组进行排序,交换元素,其间为1

时间:2016-10-14 23:14:20

标签: c arrays algorithm sorting data-structures

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

例如:
initial: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 in是一个奇怪的位置,但应该在一个平坦的位置)
我一直在想这个:
- 使用辅助数组“aux”将数字与其真实邻居放在一起,如:
v = [8,0,5,9,-1,5,6] - > aux = [8,5,-1,6,0,9,5]
现在在我可以执行与相邻数字的简单交换 - 关于它们在aux中的位置“i”的最终配置是:
v = [8,0,5,9,-1,5,6] - > aux = [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]
aux-even = [8,5,-1] - > i-even = [0,2,4]
aux-odd = [0,9,5] - > i-even = [1,3,5](以v为考虑)

我不知道从这里去哪里,或者它是否是一条很好的奔跑之路。

欢迎任何想法或帮助
编辑

我正在尝试模拟AlexD为奇数情况提出的算法:
v = [8,0,5,9,-1,5,6]
v-sorted = [-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)
但数字没有排序。我错过了什么?

1 个答案:

答案 0 :(得分:0)

为简洁起见,让我通过具体案例来说明这个想法,这些案例很容易概括。

即便如此

假设我们有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