Advertisement
Guest User

Untitled

a guest
Jun 28th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.13 KB | None | 0 0
  1. -module(main).
  2. -export([join/2, concat/1, member/2,
  3. merge_sort/1, qsort/1, insertion_sort/1,
  4. perms/1]).
  5.  
  6. shunt([],Xs) ->
  7. Xs;
  8. shunt([X|Xs],Ys) ->
  9. shunt(Xs,[X|Ys]).
  10.  
  11. reverse(Xs) ->
  12. shunt(Xs,[]).
  13.  
  14. join(Xs, Ys) ->
  15. shunt(reverse(Xs), Ys).
  16.  
  17. concat([]) -> [];
  18. concat([List]) -> List;
  19. concat([List1, List2|Tail]) ->
  20. concat([join(List1, List2)|Tail]).
  21.  
  22. member(_, []) -> false;
  23. member(X, [X|_]) -> true;
  24. member(X, [_|Xs]) ->
  25. member(X, Xs).
  26.  
  27. partition(Pred, List) ->
  28. partition(Pred, List, {[], []}).
  29.  
  30. partition(_, [], {Left, Right}) ->
  31. {reverse(Left), reverse(Right)};
  32. partition(Pred, [X|Xs], {Left, Right}) ->
  33. case Pred(X) of
  34. true -> partition(Pred, Xs, {[X|Left], Right});
  35. false -> partition(Pred, Xs, {Left, [X|Right]})
  36. end.
  37.  
  38. split(0, {Left, Right}) ->
  39. {reverse(Left), Right};
  40. split(_, {Left, []}) ->
  41. {reverse(Left), []};
  42. split(N, {Left, [X|Xs]}) ->
  43. split(N-1, {[X|Left], Xs});
  44.  
  45. split(N, List) ->
  46. split(N, {[], List}).
  47.  
  48. zip_join([], Ys) -> Ys;
  49. zip_join(Xs, []) -> Xs;
  50. zip_join([X|Xs] = List1, [Y|Ys] = List2) ->
  51. case X < Y of
  52. true -> [X|zip_join(Xs, List2)];
  53. false -> [Y|zip_join(List1,Ys)]
  54. end.
  55.  
  56. merge_sort([]) -> [];
  57. merge_sort([X]) -> [X];
  58. merge_sort(List) ->
  59. {Left, Right} = split(length(List) div 2, List),
  60. zip_join(merge_sort(Left), merge_sort(Right)).
  61.  
  62. qsort([]) -> [];
  63. qsort([X|Xs]) ->
  64. {Left, Right} = partition(fun (Y) -> Y < X end, Xs),
  65. concat([qsort(Left), [X], qsort(Right)]).
  66.  
  67. insert(X, []) -> [X];
  68. insert(X, [Y|Ys] = Sorted) ->
  69. case X < Y of
  70. true -> [X|Sorted];
  71. false -> [Y|insert(X, Ys)]
  72. end.
  73.  
  74. insertion_sort(Sorted, []) -> Sorted;
  75. insertion_sort(Sorted, [X|Xs]) ->
  76. insertion_sort(insert(X, Sorted), Xs).
  77. insertion_sort(List) -> insertion_sort([], List).
  78.  
  79. insert_after(Index, X, List) ->
  80. {Left, Right} = split(Index, List),
  81. concat([Left, [X], Right]).
  82. insert_all(X, 0, List) ->
  83. [[X|List]];
  84. insert_all(X, N, List) ->
  85. [insert_after(N, X, List)|insert_all(X, N-1, List)].
  86.  
  87. map(_, []) -> [];
  88. map(Pred, [X|Xs]) ->
  89. [Pred(X)|map(Pred, Xs)].
  90.  
  91. perms([]) -> [];
  92. perms([X]) -> [[X]];
  93. perms([X|Xs]) ->
  94. Perms = map(fun (Ys) -> insert_all(X, length(Ys), Ys) end, perms(Xs)),
  95. concat(Perms).
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement