1樓:
直接的工具,有 arraysort 巨集包。專門用來對 arrayjobx 風格的陣列排序。例子:
\documentclass
\usepackage
[comparenum]
\begin
\newarray
\readarray
% 排序前
\Arr(1), \Arr(2), \Arr(3), \Arr(4), \Arr(5), \Arr(6), \Arr(7), \Arr(8), \Arr(9), \Arr(10)
\sortArray
[arraysortcomparenum]
% 排序後
\Arr(1), \Arr(2), \Arr(3), \Arr(4), \Arr(5), \Arr(6), \Arr(7), \Arr(8), \Arr(9), \Arr(10)
\end
還有 LaTeX3 的實驗性巨集包 l3sort,對逗號列表或 LaTeX3 風格的 sequence 排序。例子:
\documentclass
\usepackage
\begin
\ExplSyntaxOn
\clist
_set:Nn \l
_foo_clist
% 排序前
\l_foo_clist\par
\clist
_sort:Nn \l
_foo_clist <
}% 排序後
\l_foo_clist
\ExplSyntaxOff
\end
TeX.sx 上有其他一些做法,見
programming - How to sort an alphanumeric list
裡面 TH. 給出了乙個可完全展開的插入排序,也比較容易理解。
2樓:
可以用 LaTeX3 專案的 l3sort 巨集包 [1],具體用法就請自行檢視它的手冊吧。
為了提高效能,l3sort 先將待排序的專案逐個儲存到 \toks 暫存器中(時間複雜度為 )。因此對排序的專案數量有限制,LuaTeX 最多只能有 49152 項,其他 eTeX 引擎是 24576 項。
l3sort 採用的是自底向上的歸併排序演算法 [2],時間複雜度為 ,但效率遠比不上其他程式語言。比如在我這裡,下面的簡單例子,排序 22000 個數字,需要 0.8 秒左右:
% !TeX program = pdflatex
\RequirePackage
\RequirePackage
\ExplSyntaxOn
%% 生成 22000 個數字。
\tl_set:Nx \l
_tmpa_tl }
\benchmark:n }
\tex
_end:D
但我覺得能用 TeX 做到這樣子,已經相當不錯了。
我在 LuaTeX 中用 Lua 實現的歸併排序對比了一下。首先是 Lua 指令碼 mergesort.lua:
local
function
merge(a
,b)localr=
{}locali,
j=1,
1localm,
n=#a
,#bfork=
1,m+
ndoifj
>nor
(i<=manda[
i]<=b[
j])thenr[
k]=a
[i]i
=i+1
elser[
k]=b
[j]j
=j+1
endend
return
rend
local
function
split(a
)locala1,
a2={},{}
localn=
#alocal
mid=
math.floor(n
/2)fori=
1,middoa1[
i]=a
[i]end
fori=1
,n-mid
doa2[i
]=a[
i+mid]
endreturna1,
a2end
function
merge_sort(a
)if#a
>1then
locala1,
a2=split(a
)return
merge
(merge_sort(a1
),merge_sort(a2
))else
return
aend
end然後是測試用的 TeX 指令碼:% !TeX program = lualatex
\RequirePackage
\RequirePackage
% 生成 49152 個隨機數字。
\directlua
math.randomseed(os.time())
for i = 1, 49152 do
rand_int_array[i] = math.random(1000000)
end}\ExplSyntaxOn
\tl_const:Nx \c
_test_clist }
\clist
_set_eq:NN \l
_tmpa_clist \c
_test_clist
\benchmark:n }
\directlua
\benchmark:n }
}\tex
_end:D
用 lualatex 執行上述指令碼,我這裡輸出為3.025009155273437 seconds
0.486248016357422 seconds
TeX 的實現比 Lua 慢了大約乙個數量級。
[1]: CTAN: Package l3experimental
[2]: Merge sort
怎樣在perl中對陣列排序?
vic yang 二維陣列分級排序 第一列元素優先,第二列其次,以此類推 假設子陣列元素數量不一致 my arr 16,5 3,2 16,7,2,2,1 16,2 2,2 16,5,2,2,1 19,3 1,1 2,2,2,2,1 5,5 3,2 1 my brr reverse sort a i ...
在易經裡面哪些數字是吉祥數字,怎麼解釋?
丐幫幫主安 恒卦的卦象象徵著恆久 亨通,沒有過失和傷害,對堅守正道和有所前往有利。初六爻,深入追求恆久的道理,若能夠堅守正道可以防範凶險的發生,否則一點好處都沒有。九二爻,悔恨消失得無影無蹤。九三爻,無法讓美德恆久地保持下去,就可能受到別人的羞辱,堅守正道可防止遺憾。九四爻,在田間打獵卻沒有捕獲獵物...
積分符號中間加一橫在LaTeX中怎麼打?
參見如下CTAN官網的symbols文件中,搜 dashint,是人工定義的命令 The Comprehensive 定義如下 def Xint 1 int def XXint 1 2 3 vcenter kern 5 wd0 def ddashint def dashint 使用時候用 dashi...