LaTeX/Algorithms 伪代码
2013年4月11日 16:43
这段时间在上算法课,有些作业题目要求写出伪代码。正好这段时间在学习latex,于是就收集整理了下latex描写算法的包。latex下描写算法的包主要有algorithmic, algorithmicx和algorithm2e
algorithmic和algorithmicx
介绍下algorithmic和algorithmicx,这两个包很像,很多命令都是一样的,只是algorithmic的命令都是大写,algorithmicx的命令都是首字母大写,其他小写(EndFor两个大写)。下面是algorithmic的基本命令
\STATE <text>
\IF{<condition>} \STATE{<text>} \ENDIF
\FOR{<condition>} \STATE{<text>} \ENDFOR
\FOR{<condition> \TO <condition> } \STATE{<text>} \ENDFOR
\FORALL{<condition>} \STATE{<text>} \ENDFOR
\WHILE{<condition>} \STATE{<text>} \ENDWHILE
\REPEAT \STATE{<text>} \UNTIL{<condition>}
\LOOP \STATE{<text>} \ENDLOOP
\REQUIRE <text>
\ENSURE <text>
\RETURN <text>
\PRINT <text>
\COMMENT{<text>}
\AND, \OR, \XOR, \NOT, \TO, \TRUE, \FALSE
对比看一下,下面是algorithmicx包的基本命令
\State <text>
\If{<condition>} <text> \EndIf
\If{<condition>} <text> \Else <text> \EndIf
\If{<condition>} <text> \ElsIf{<condition>} <text> \Else <text> \EndIf
\For{<condition>} <text> \EndFor
\ForAll{<condition>} <text> \EndFor
\While{<condition>} <text> \EndWhile
\Repeat <text> \Until{<condition>}
\Loop <text> \EndLoop
\Require <text>
\Ensure <text>
\Function{<name>}{<params>} <body> \EndFunction
\State \Return <text>
\Comment{<text>}
另外,还有3个修改algorithm标签,require标签,ensure标签显示的三个命令:
\floatname{algorithm}{算法}
\renewcommand{\algorithmicrequire}{\textbf{输入:}}
\renewcommand{\algorithmicensure}{\textbf{输出:}}
algorithmicx例子
正好学着用algorithmicx写了下归并排序求逆序数,代码如下
\documentclass[11pt]{article} \usepackage{CJK} \usepackage[top=2cm, bottom=2cm, left=2cm, right=2cm]{geometry} \usepackage{algorithm} \usepackage{algorithmicx} \usepackage{algpseudocode} \usepackage{amsmath} \floatname{algorithm}{算法} \renewcommand{\algorithmicrequire}{\textbf{输入:}} \renewcommand{\algorithmicensure}{\textbf{输出:}} \begin{document} \begin{CJK*}{UTF8}{gkai} \begin{algorithm} \caption{用归并排序求逆序数} \begin{algorithmic}[1] %每行显示行号 \Require $Array$数组,$n$数组大小 \Ensure 逆序数 \Function {MergerSort}{$Array, left, right$} \State $result \gets 0$ \If {$left < right$} \State $middle \gets (left + right) / 2$ \State $result \gets result +$ \Call{MergerSort}{$Array, left, middle$} \State $result \gets result +$ \Call{MergerSort}{$Array, middle, right$} \State $result \gets result +$ \Call{Merger}{$Array,left,middle,right$} \EndIf \State \Return{$result$} \EndFunction \State \Function{Merger}{$Array, left, middle, right$} \State $i\gets left$ \State $j\gets middle$ \State $k\gets 0$ \State $result \gets 0$ \While{$i<middle$ \textbf{and} $j<right$} \If{$Array[i]<Array[j]$} \State $B[k++]\gets Array[i++]$ \Else \State $B[k++] \gets Array[j++]$ \State $result \gets result + (middle - i)$ \EndIf \EndWhile \While{$i<middle$} \State $B[k++] \gets Array[i++]$ \EndWhile \While{$j<right$} \State $B[k++] \gets Array[j++]$ \EndWhile \For{$i = 0 \to k-1$} \State $Array[left + i] \gets B[i]$ \EndFor \State \Return{$result$} \EndFunction \end{algorithmic} \end{algorithm} \end{CJK*} \end{document}
最后的排版结果如下
algorithm2e还没有学习,待以后再更新吧