如何重新排列数组中的数据,以便两个相似的项目不是彼此相邻?

Mar*_*k K 10 javascript c c++ java algorithm

只是想重新排列数组中的数据,以便类似的项目不在每个数据旁边.不应该从数组中删除数据,如果无法重新排列,则可以将数据放在数组的末尾.但保持原始秩序是必要的.

   1 1 2             =>   1 2 1 
   1 1 1 2 3         =>   1 2 1 3 1
   1 1 2 1 3 3 5 1   =>   1 2 1 3 1 3 5 1
   1 1 1 1 1 1 2     =>   1 2 1 1 1 1 1
   8 2 1 3 7 2 5     =>   rearrange not needed
   8 2 2 2 7 2 5 2   =>   8 2 7 2 5 2 2      // keep the original order
Run Code Online (Sandbox Code Playgroud)

编辑:添加示例以显示需要保持原始顺序

art*_*oex 9

  1. 对数组进行排序
  2. 使用较高的对映对应物在小的偶数索引处交换元素:

    for ( i=0; i < arr.length/2; i+=2 )
        arr.swap(i,arr.length-1-i);
    
    Run Code Online (Sandbox Code Playgroud)

编辑:好的,我们应该重新定义对映对手.也许这个更好:混合第一和第三四分位数(在图中表示为x,y),以及混合第二和第三四分位数(表示为u,v,w).让对手提升平行.

        25%  50%  75%
         |    |    |
    -----[----[----[----
    11122334455667788999
     x y u v w x y u v w  <-- u, v, w, x, y indicate swap positions
    16172839495161738495
Run Code Online (Sandbox Code Playgroud)


Pau*_*ier 4

唔。我想到了冒泡排序,但需要进行三元素比较;也就是说,如果item[x]item[x + 1]相同且item[x + 2]不同,则交换item[x + 1]item[x + 2]。重复遍历列表,直到没有交换发生。当然,执行顺序很糟糕,但这应该可以满足您的需求。