线性时间原位浅滩混洗算法
是否存在线性时间就地浅滩混洗算法?这是一些特别灵巧的手能够执行的算法:均匀划分偶数大小的输入数组,然后交织两半的元素。 Mathworld上有一个关于浅滩混洗的简短页面。特别是,我对混洗类型感兴趣,该混洗类型将输入数组1 2 3 4 5 6转换为1 4 2 5 3 6。请注意,在其定义中,输入长度为2n2n2n。 如果我们有第二个大小为nnn或更大的数组,则可以在线性时间内直接执行此操作。首先将最后nnn元素复制到数组中。然后,假设为基础的0索引,复制所述第一nnn元件从索引[0,1,2,...,n−1][0,1,2,...,n−1][0,1,2,...,n-1]至[0,2,4,...,2n−2][0,2,4,...,2n−2][0, 2, 4,...,2n-2]。然后复制nnn从第二阵列回输入数组元素,映射索引[0,1,2,...,n−1][0,1,2,...,n−1][0,1,2,...,n-1]到[1,3,5,...,2n−1][1,3,5,...,2n−1][1,3,5,...,2n-1]。(我们可以做的工作比这少一点,因为输入中的第一个和最后一个元素不会移动。) 一种尝试就地执行此操作的方法包括将置换分解为不相交的循环,然后根据每个循环重新排列元素。同样,假设基于0的索引,则6元素情况下涉及的置换为 σ=(001224314355)=(0)(5)(1243).σ=(012345024135)=(0)(5)(1243). \sigma=\begin{pmatrix} 0 & 1 & 2 & 3 & 4 & 5 \\ 0 & 2 & 4 & 1 & 3 & 5\end{pmatrix}=\begin{pmatrix}0 \end{pmatrix} \begin{pmatrix}5 \end{pmatrix} \begin{pmatrix}1 & 2 & 4 &3 …