我想通过突出显示每个步骤中所做的更改来可视化排序算法。例如:
[ 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_1
)a_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
}
}
其余代码保持不变,结果如下: