Skip to content

Instantly share code, notes, and snippets.

@andykais
Last active October 27, 2016 20:59
Show Gist options
  • Save andykais/7a3cf750b22f302041db6440cb4ad77a to your computer and use it in GitHub Desktop.
Save andykais/7a3cf750b22f302041db6440cb4ad77a to your computer and use it in GitHub Desktop.
merge(A, []) -> {A, 0};
merge([], B) -> {B, 0};
merge([Ha|Ta], [Hb|Tb]) ->
if
Ha < Hb -> {MergedList, N}=merge(Ta, [Hb|Tb]),
{[Ha | MergedList], N};
true -> {MergedList, N}=merge([Ha|Ta], Tb),
{[Hb | MergedList], N + 1}
end.
pMergeSort(L) when length(L) == 1 -> L;
pMergeSort(L) when length(L) > 1 ->
{L1, L2} = lists:split(length(L) div 2, L),
spawn(main, pMergeSort2, [L1, self()]),
spawn(main, pMergeSort2, [L2, self()]),
mergeResults().
pMergeSort2(L, Parent) when length(L) == 1 ->
Parent ! L;
pMergeSort2(L, Parent) when length(L) > 1 ->
{L1, L2} = lists:split(length(L) div 2, L),
spawn(main, pMergeSort2, [L1, self()]),
spawn(main, pMergeSort2, [L2, self()]),
Parent ! mergeResults().
mergeResults() ->
L1 = receive
Res -> Res
end,
L2 = receive
Res -> Res
end,
{MergedList, N} = merge(L1, L2),
MergedList.
% Call pMergeSort(IndexedList).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment