上接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(排序)方法源码解析(二)相关推荐

  1. 【Android 异步操作】线程池 ( 线程池 execute 方法源码解析 )

    文章目录 一.线程池 execute 方法源码解析 二.线程池 execute 方法完整源码及注释 一.线程池 execute 方法源码解析 进入 ThreadPoolExecutor 中 , 查看线 ...

  2. Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统

    Qt下MQTT模块的导入(源码直接导入)适用Windows和Linux系统 0.环境 1.MQTT 源码下载(也可以去官网下载) 2.MQTT源码解压成功复制 src/mqtt 文件夹到工程中 3.我 ...

  3. Spring 注解面面通 之 @CrossOrigin 注册处理方法源码解析

      参照<Spring 注解面面通 之 @RequestMapping 注册处理方法源码解析>,其讲解了@RequestMapping注释的处理方法注册过程,而@CrossOrigin是基 ...

  4. django模块http之cookie源码解析

    上一章对django的HttpResponse的源码进行分析,对上一篇存在的cookie源码问题,用这篇博客进行分析,若想看关于HttpResponse详解的可点击django模块http之HttpR ...

  5. jQuery方法源码解析--jQuery($)方法(一)

    jQuery方法源码解析--jQuery($)方法 注: 1.本文分析的代码为jQuery.1.11.1版本,在官网上下载未压缩版即可 2.转载请注明出处 jQuery方法: 这个方法大家都不陌生,在 ...

  6. 【深度学习模型】智云视图中文车牌识别源码解析(二)

    [深度学习模型]智云视图中文车牌识别源码解析(二) 感受 HyperLPR可以识别多种中文车牌包括白牌,新能源车牌,使馆车牌,教练车牌,武警车牌等. 代码不可谓不混乱(别忘了这是职业公司的准产品级代码 ...

  7. Mobx 源码解析 二(autorun)

    前言 我们在Mobx 源码解析 一(observable)已经知道了observable 做的事情了, 但是我们的还是没有讲解明白在我们的Demo中,我们在Button 的Click 事件中只是对ba ...

  8. android网络框架retrofit源码解析二

    注:源码解析文章参考了该博客:http://www.2cto.com/kf/201405/305248.html 前一篇文章讲解了retrofit的annotation,既然定义了,那么就应该有解析的 ...

  9. Kubernetes学习笔记之Calico CNI Plugin源码解析(二)

    女主宣言 今天小编继续为大家分享Kubernetes Calico CNI Plugin学习笔记,希望能对大家有所帮助. PS:丰富的一线技术.多元化的表现形式,尽在"360云计算" ...

最新文章

  1. xpath定位中starts-with、contains和text()的用法
  2. cassandra框架模型之二——存储机制 CommitLog MemTable SSTable
  3. 《视频直播技术详解》系列之七:现代播放器原理
  4. 24行代码-Leecode 2063. 所有子字符串中的元音——Leecode周赛系列
  5. Fiori应用的书签模式 - bookmark
  6. linux-shell命令之chgrp(change group)【更改群组】
  7. html期末网页设计,求网页设计的期末作业一份 HTML的
  8. java中的10的算法,Java中10个常用的排序算法
  9. RK3399Pro Android Rock-X 人工智能开发系列(2)
  10. JS 没有块级作用域
  11. vue快速复制快捷键_vue快捷键与基础指令详解
  12. 熊猫猪新系统測试之二:Mac OS X 10.10 优胜美地
  13. XML 处理利器 : XStream
  14. 为什么MASKRCNN中使用ROIAlign替代ROIPool
  15. mac以及windows日语键盘快捷键
  16. k-means聚类算法过程与原理
  17. 上海市高等学校信息技术水平考试试卷及参考答案
  18. iPhone 8 和 8 Plus 发布!双面全玻璃设计,配置提升
  19. java斗地主发牌_实现斗地主发牌(java)
  20. Distinct语法的使用

热门文章

  1. 东北农业大计算机排名,黑龙江高校排名更新,东北林大排名第3,东油排名第8...
  2. python的颜色有哪些_Python颜色分类及格式
  3. android 展示星期方式,Android显示从一周到另一周的日期(星期四至星期四)
  4. 华大单片机m4内核的滴答定时器_微处理器、单片机及其外设,处理还是控制?...
  5. VS2010报错 error:LINK1123:转换到COF期间失败,文件无限或损坏
  6. Win32ASM学习[23]:RadASM快捷键
  7. error: ‘CV_BGR2RGB’ was not declared in this scope
  8. Linux第一条指令地址,arm-linux 启动代码分析——stage1 (1)
  9. 160 - 33 Cruehead.1
  10. python安全攻防---信息收集---whois查询