2014-12-30 204 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)