在 LaTeX 中怎麼排序數字?

時間 2021-06-02 16:06:36

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...