2014-12-30 3 views
1

Мне нужно отсортировать массивы, но не классические. Более того, в Эрланге! Я говорю о массивах, где каждый элемент представляет собой массив из двух целых чисел.Сортировка массива массивов в 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], «\ т \ б», "\ v \ ф"[16,4]]]

Да, действительно, с этим \ т \ б ..

Я новичок в Erlang, но я удается сделать много вещей один. Мой проект о алгоритме Шанка, который пытается решить y = a^x mod n где y, a и n заданы.

Не могли бы вы помочь мне, сообщив мне, что не так с моим модулем insertSort?

Большое спасибо, извините за мой английский, я старался изо всех сил.

+0

Обратите внимание, что «\ t \ b» - это еще один способ написания [9,8]. Они означают одно и то же. Аналогично, «\ v \ f» совпадает с [11,12]. Это просто, что оболочка будет печатать его как строку, если список состоит из печатных кодов символов. – RichardC

+0

Спасибо @RichardC за это просветление! –

+0

Я не могу попробовать это на своем пэде, но я думаю, что 'lists: 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". Попробуйте ввести этот список в свою оболочку, это просто красивая версия erlang ... иногда не точная.

+0

Большое спасибо за эту коррекцию, теперь она работает хорошо! Я понимаю теперь отношение, которое Эрланг делает между строками и списками. Очень полезно, еще раз спасибо. –

1

Возможно, вам не следует писать собственную функцию сортировки. Если списки: сортировки (список) не то, что вы хотите для вашего случая использования, вы можете отсортировать по только первому элементу подсписков так:

lists:sort(fun ([H1|_],[H2|_]) -> H1 =< H2 end, 
      List) 
Смежные вопросы