我遇到了这个问题:
我必须开发一种算法来获取一个int数组并重新调整尊重这些约束的元素:
对于每个元素,必须低于其邻居或大于其邻居:
for each x in array a,
( a[x-1]<=a[x] AND a[x+1]<=a[x] )
OR
( a[x-1]>=a[x] AND a[x+1]>=a[x] )
在最坏的情况下,这一切都在theta(n log n)
我不知道怎么做,我唯一的直觉是我必须做类似于合并排序的事情...
抱歉mi英文不好
答案 0 :(得分:4)
对数组进行排序
切成两半
将前半部分的元素放在下半部分之间
如果elemnts的数量不均匀,则将最后一个元素移到前面
示例:
2 3 1 5 7 8 6 4 9
1 2 3 4 5 6 7 8 9
1 5 2 6 3 7 4 8 9
9 1 5 2 6 3 7 4 8
答案 1 :(得分:0)
作为一种天真的方法,您可以先执行一些排序,然后将数组分组到相同大小的组。之后,相邻的组必须成对切换;如果组的数量是奇数,则需要将第一组切换到后面。
一个例子:
输入:9 9 8 8 7 7 6 6 5 5 4 4 3 3 2 2 1 1
(已排序)
群组:(9 9) (8 8) (7 7) (6 6) (5 5) (4 4) (3 3) (2 2) (1 1)
组成对切换:(8 8) (9 9) (6 6) (7 7) (4 4) (5 5) (2 2) (3 3) (1 1)
第一组移到后面:(9 9) (6 6) (7 7) (4 4) (5 5) (2 2) (3 3) (1 1) (8 8)
也许可以改进这个想法以获得更好的算法。