日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

erlang下lists模块sort(排序)方法源码解析(二)

發布時間:2023/11/30 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 erlang下lists模块sort(排序)方法源码解析(二) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上接erlang下lists模塊sort(排序)方法源碼解析(一),到目前為止,list列表已經被分割成N個列表,而且每個列表的元素是有序的(從大到小)

下面我們重點來看看mergel和rmergel模塊,因為我們先前主要分析的split_1_*對應的是rmergel,我們先從rmergel查看,如下

.......................................................

split_1(X, Y, [], R, Rs) ->
   rmergel([[Y, X | R] | Rs], []).

....................................................... split_1_1(X, Y, [], R, Rs, S) -> rmergel([[S], [Y, X | R] | Rs], []). .............................................................

rmergel的代碼比較多,看一下發現其實思路非常清晰,

1 rmergel([[H3 | T3], [H2 | T2], T1 | L], Acc) -> 2 rmergel(L, [rmerge3_1(T1, [], H2, T2, H3, T3) | Acc]); 3 rmergel([[H2 | T2], T1], Acc) -> 4 mergel([rmerge2_1(T1, H2, T2, []) | Acc], []); 5 rmergel([L], Acc) -> 6 mergel([lists:reverse(L, []) | Acc], []); 7 rmergel([], Acc) -> 8 mergel(Acc, []).

當列表的個數>=3超過就用拿3個進行比較合并rmerge3_1實現,把這3個列表拼成1個有序的列表(拼完成了從小到大);剩下的按照這個邏輯

當然列表=2就拿2個進行比較合并rmerge2_1實現,把這2個列表拼成1個有序的列表(拼完成了從小到大)

當列表只有1個的時候,這個列表就是有序的了

整個邏輯是這樣的,當列表大于等于2個,先調用rmerge3_1,如果H1>=H2就調用rmerge3_21,否則就調用rmerge3_12,然后rmerge3_21如果H3>=H1就說明H3最大,然后繼續比較

總得來說,就是把3個列表的第一個元素拿出來,比較,最大的放變量M里面,根據比較的順序不同,使用不同的函數。

按照這個理解,復雜程度應該是log3n*n不是先前理解的n,

可是這里不能理解的是為什么要拿3個來比較,

我按照一次拿2個的邏輯來寫,代碼就簡單很多,可是運行的時間差不多是原作者的的1.5-2倍,實在不能理解

附上我一次拿2個列表的邏輯代碼

my_rmerge([H1,H2|T], R) ->my_rmerge(T, [my_rmerge2(H1, H2, [])|R]); my_rmerge([H1], R) ->my_merge([lists:reverse(H1)|R], []); my_rmerge([], [R]) ->R; my_rmerge([], R) ->my_merge(R, []).my_rmerge2([H1|T1],[H2|T2], List) when H2 >= H1 ->([H1|T1], T2, [H2|List]); my_rmerge2([H1|T1],[H2|T2], List) ->my_rmerge2(T1, [H2|T2], [H1|List]); my_rmerge2([], L2, List) ->lists:reverse(L2, List); my_rmerge2(L1, [], List) ->lists:reverse(L1, List).my_merge([H1,H2|T], R) ->my_merge(T, [my_merge2(H1, H2, [])|R]); my_merge([H1], R) ->my_rmerge([lists:reverse(H1)|R], []); my_merge([], [R]) ->lists:reverse(R); my_merge([], R) ->my_rmerge(R, []).my_merge2([H1|T1],[H2|T2], List) when H2 < H1 ->my_merge2([H1|T1], T2, [H2|List]); my_merge2([H1|T1],[H2|T2], List) ->my_merge2(T1, [H2|T2], [H1|List]); my_merge2([], L2, List) ->lists:reverse(L2, List); my_merge2(L1, [], List) ->lists:reverse(L1, List).

查看對比結果

1 95> timer:tc(tt1, mysort, [B2]). 2 {48842, 3 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 4 23,24,25,26,27|...]} 5 96> timer:tc(tt1, mysort, [B2]). 6 {53618, 7 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 8 23,24,25,26,27|...]} 9 97> timer:tc(lists, sort, [B2]). 10 {31179, 11 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 12 23,24,25,26,27|...]} 13 98> timer:tc(lists, sort, [B2]). 14 {29326, 15 [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22, 16 23,24,25,26,27|...]}

B2是一個1到100000的亂序列表,為什么差別會這么大,

有沒有大神解釋一下,按這樣的邏輯,如果一次拿4個是不是更塊,代碼當然更多~~~

?

轉載于:https://www.cnblogs.com/tudou008/p/9078302.html

總結

以上是生活随笔為你收集整理的erlang下lists模块sort(排序)方法源码解析(二)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。