使用箭头可视化数组变化

使用箭头可视化数组变化

我想通过突出显示每个步骤中所做的更改来可视化排序算法。例如:

[ a_1 a_2 a_3 a_4 ]
             X
[ a_1 a_2 a_4 a_3 ]
         X      
[ a_1 a_4 a_2 a_3 ]

等等。

我希望用两个箭头从元素的底部中心指向顶部中心来代替“X”,这样会更好(但是在这个解决方案中用 ASCII 很难做到这一点,所以我无法在上面展示这一点……)。

此外,只交换相邻元素,因此我暂时不关心更复杂的情况(例如,在上面的例子中交换a_1a_4。(但我也欢迎关注这一点的答案!)

如何用 LaTeX 实现?给我看看漂亮的箭头答案。:)

提前致谢。

PS:虽然我添加了tikz-arrows标签,但我确实欢迎不使用 tikz 的解决方案。但我认为大多数答案无论如何都会使用 tikz,因此标签应该没有问题。

答案1

基本结构可以是 tikz 矩阵。每一行都是图表中的一个步骤。创建矩阵后,其节点将根据其在矩阵内的位置自动命名,因此您可以绘制连接它们的箭头、围绕它们的圆圈等。当然,箭头的样式可以自定义。

以下代码显示了一个示例。请注意,为了用括号分隔每行,需要一点技巧,因为 tikz 以特殊方式解释矩阵内的括号。

\usetikzlibrary{matrix}
\def\leftbracket{[}
\def\rightbracket{]}

\tikzset{my arrow/.style={
  blue!60!black,
  -latex
  }
}

\begin{tikzpicture}
\matrix[matrix of math nodes, row sep=4mm] (M) {
\leftbracket & a_1 & a_2 & a_3 & a_4 & \rightbracket \\
\leftbracket & a_1 & a_2 & a_4 & a_3 & \rightbracket \\
\leftbracket & a_1 & a_4 & a_2 & a_3 & \rightbracket \\
};

\draw[my arrow] (M-3-3) to (M-2-4);
\draw[my arrow] (M-2-4) to (M-1-5);
\end{tikzpicture}

结果:

结果

再举一个自定义的例子,将my arrow样式改为:

\tikzset{my arrow/.style={
  blue!60!black,
  ->,
  out=90, in=-90
  }
}

其余代码保持不变,结果如下:

另一个结果

相关内容