2014-12-30 205 views
1

我需要對數組進行排序,但不是經典排序。而且,在Erlang! 我在談論數組,其中每個元素是兩個整數的數組。在Erlang中對數組進行排序

例如: [[6,0],[12,1],[5,2],[10,3]]

我需要這個陣列中的第一個元素的功能進行排序每個陣列 像這樣:

[[5,2],[6,0],[10,3],[12,1]]

首先,我與此成功:

-module(insertSort). 
-export([insertion/1,insert/1,insert/2]). 

insertion(L) -> lists:foldl(fun insert/2, [], L). 

insert([]) -> []. 

insert(X,[]) -> [X]; 
insert([],Y) -> [Y]; 

insert(X= [X1,_], L= [[H1,_] | _]) when X1 =< H1 -> [X|L]; 

insert(X,[H|T]) -> [H|insert(X, T)]. 

有時,數組被排序。但我有兩個例子,給我兩個奇怪的情況:

第一: [10,3],[5,2],[12,1],[6,0] 成爲: [[[5,2],[6,0],[10,3],[12,1]]]]

不錯,但我不能用那個奇怪的建築。看起來我有一個數組,裏面有一個數組,裏面有我所有的兩個元素數組。

第二: [[5,16],[11,12],[9,8],[16,4]] 成爲: [[[5,16],「\噸\ b」, 「符\ v \ F」,[16.4]]]

是的,真的,這些\ t \ b ..

我在二郎一個初學者,但我成功做了很多東西我自己。 我的項目是關於Shank算法,試圖解決y = a^x mod n其中給出了y,a和n。

你能幫我告訴我,我的insertSort模塊有什麼問題嗎?

非常感謝,對不起我的英語,我盡力做到最好。

+0

請注意,「\ t \ b」只是另一種寫作方式[9,8]。他們的意思完全一樣。同樣,「\ v \ f」與[11,12]相同。只是如果列表由可打印字符代碼組成,那麼shell會將其打印爲字符串。 – RichardC

+0

謝謝@RichardC的啓發! –

+0

我無法在我的手機上試用它,但我認爲'list:sort(L).'就是你想要的。 – Pascal

回答

1

正如我在我的評論說,的排序功能列表庫完全符合你的要求。

1> lists:sort([ [6,0], [12,1], [5,2], [10,3] ]). 
[[5,2],[6,0],[10,3],[12,1]] 
2> 
1

我認爲問題是與線:

insert([],Y) -> [Y]; 

Y是已排序列表,所以應該歸還,因爲它是

insert([],Y) -> Y; 

Erlang strings都是整數的列表,這樣當你的列表不是真的是一個字符串,但包含指定編碼的代碼點,然後用字符串符號打印,但它仍然是一個列表。列表[65,65,67,68]等於"ABCD"。試着將這個列表輸入到你的shell中,這只是一個erlang漂亮的打印......有時候不準確。

+0

非常感謝您的糾正,現在它運作良好! 我現在明白了Erlang在字符串和列表之間的關係。 非常有幫助,再次感謝。 –

1

你可能不應該寫你自己的排序功能。如果列表:排序(列表)是不是你想要什麼你的使用情況,您可以進行排序僅在子列表的第一個元素是這樣的:

lists:sort(fun ([H1|_],[H2|_]) -> H1 =< H2 end, 
      List)