电商网站页面布局,微平台推广多少钱,网站建设论文3000字,汕头互联网公司上接erlang下lists模块sort#xff08;排序#xff09;方法源码解析(一)#xff0c;到目前为止#xff0c;list列表已经被分割成N个列表#xff0c;而且每个列表的元素是有序的#xff08;从大到小#xff09; 下面我们重点来看看mergel和rmergel模块#xff0c;因为我… 上接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如果H1H2就调用rmerge3_21,否则就调用rmerge3_12然后rmerge3_21如果H3H1就说明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