erlang 實現並行快速排序

2021-07-02 08:04:47 字數 2127 閱讀 5732

%在保證尾遞迴的情況下,使用乙個輔助函式 handl 對parallel_qsort進行包裝,則parallel_qsort只管 分發任務即可,計算好了 再進行樹形通訊合併,之前一直在糾%結於是不是要使用程序字典,來儲存有哪些程序,程序字典,在erlang program一書中,不建議採用,因為其提供了共享資料的可能,破壞了erlang的設計原則,erlang是面向訊息的語言,進行間通訊只能通過訊息。-module (parallel_qsort).

-export ([start/2,handle/5]).

% 測試資料

% parallel_qsort:start([11,3,2,8,9,4,10,23,45,100,15,0,-1,47,9,32,12,64,5,35,79,77,27,1,6,7],8).

% parallel_qsort:start([11,3,2,8,9,4,33,34,34,10,23,45,100,15,0,-1,47,9,32,12,64,5,35,79,77,27,1,6,7],8).

% 啟動執行緒的工作

% 1.啟動 各個執行執行緒

start (data ,m) ->

io:format("len : ~w~n",[lists:flatlength(data)]),

spawn(?module,handle,[data,m,m,1,self()]).

% 包裝parallel_qsort,和合併結果的操作

handle(data,m,processnum,id,master) ->

io:format("id ~w~n",[id]),

= parallel_qsort(data,m,processnum,id,master,[self()]),

merge_wait(res,master,id,2,processnum,pids).

% 通過id 判斷 改發還是改接,master 是要發給的程序 ,m是遞迴的輪數

merge_wait(res,master,id,judge,m,pids) when m =:= 1 ->

io:format("result : ~w :~w ~n",[res,lists:flatlength(res)]);

merge_wait(res,master,id,judge,m,[hid|tids]) ->

if id rem judge =:= 1 ->

receive

-> %不能判斷接收的順序

io:format("receive: ~w ~w ~n",[id,newres]),

merge_wait(newres,master,id,judge*2,m div 2,tids)

end;

true ->

io:format("send from ~w ~w ~n",[id,res]),

master !

end.

% 劃分 分發任務

% 直到 列表很小或者m=0(沒有單獨核來跑程序) 序列排序

% 此時 將自己的結果和id發回主線程

parallel_qsort(data,m,start,id,master,pids) ->

len = lists:flatlength(data),

if m =:= 1->

newdata = lists:sort(data),

io:format("get ~w ~w ~n",[id,newdata]),

;true ->

= partition(data),

% io:format("~w:~w ~n",[frontpart,behindpart]),

pid = spawn(?module,handle,[behindpart,(m div 2),start,id+(m div 2),self()]),

parallel_qsort(frontpart,m div 2,start,id,master,[pid|pids])

end.

partition() -> ;

partition([h|t]) when t =:= -> ;

partition([h|t]) ->

.

erlang 實現psrs 並行排序演算法

module psrs export start 2,handle 1 測試資料 psrs start 15,46,48,93,39,6,72,91,14,36,69,40,89,61,97,12,21,54,53,97,84,58,32,27,33,72,20 3 將資料分給各個程序,並建立 no...

Erlang 奇偶並行排序

module exe9 export start 2,handle 4 l 2,12,14,25,31,42,43,43,13,34,34,41,41,312,352,354 將資料分給各個程序,並建立 nodecreater pids,m,id,master io format pids w id...

並行快速排序

感謝淺水清流投遞本稿。併發演算法是多核時代開始流行的技術趨勢,比如tbb,ppl都提供了大量有用的併發演算法。經典演算法中,排序是乙個很適合採用分治法併發的場合,比如快速排序。常規的快速排序,先在陣列中選取乙個基準點,將陣列分割槽為小於基準點和大於基準點 相同的數可以到任一邊 對分割槽的子陣列遞迴的...