阵列的就地重新排序算法

时间:2012-11-30 14:43:08

标签: algorithm

  

可能重复:
  Reordering of array elements
  Interview test - rearrange the array

我有一个数组,其中三个语义元素(a,b,c)以形式存储:

[a][b][c][a][b][c][a][b][c]...

这意味着b和c不是实际值。第一个a可能是10,第二个是1,第三个是25,依此类推。 a b和c表示该程序将给出所有索引,其中您看到“a”具有某种语义含义,对于b和c则相同。

我想重新排序,所以它有以下形式:

[a][a][a]...[b][b][b]...[c][c][c].... 

有没有办法“就地”执行此操作,这意味着不使用临时“缓冲”数组?

值为的示例:

启动数组:

  

[11] [5] [3] [284] [123123] [841823] [0] [11] [22]

我需要将其重新排序为:

  

[11] [284] [0] [5] [123123] [11] [3] [841823] [22]

1 个答案:

答案 0 :(得分:0)

有一个O(n.lgn)时间分而治之算法,O(1)额外的内存使用:

假设您要重新排序3n大小的数组:

A = [1,n + 1,2n + 1,2,n + 2,2n + 2,...,n,2n,3n]。

将A分为两个子阵列A1和A2,A1包括编号为1至3 * [n / 2]的索引,A2包括索引3 * [n / 2] +1至3n。 递归地重新排序A1和A2(就地)。然后,A变成类似6分数的数组[p1,p3,p5,p2,p4,p6],每个部分都是一个正确排序的后续元素的子数组,你可以将它们重新排序为[p1,p2, p3,p4,p5,p6]在O(n)中与交换操作就地。

T(n)= 2T(n / 2)+ O(n)= O(n lgn)