python sort().docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
来源: HYPERLINK /maverick/archive/2006/07/09/951101.aspx /maverick/archive/2006/07/09/951101.aspx 学习笔记:Python的排序 Python语言内置了sort方法,可以很方便地对某个List进行排序: L = [6, 5, 1, 3, 4, 2] L.sort() print L ———- Run Python Program ———- [1, 2, 3, 4, 5, 6] 某些时候,我们希望按照自己定义的排序规则来排序(例如,按关键词的权重排序,按人的年龄排序,等等)。在Java语言中,我们可以自定义Comparator来实现,Python中也提供了类似的办法。 若List中每个元素都是2-tuple,tuple中第一个元素为String类型的keyword,第二个元素为该字符串对应的权重(int类型),希望按照权重排序(从高到低),则可以这样: def my_cmp(E1, E2): return -cmp(E1[1], E2[1]) #compare weight of each 2-tuple #return the negative result of built-in cmp function #thus we get the descend order L = [(a, 0), (b, 1), (c, 2), (d, 3)] L.sort(my_cmp) print L ———- Run Python Program ———- [(d, 3), (c, 2), (b, 1), (a, 0)] 正因为可以自定义cmp方法,我们不妨探究一下,built-in的sort方法,到底是采用的哪一种排序算法: from random import shuffle def my_cmp(E1, E2): print ‘E1:’, E1, ‘E2:’, E2 return cmp(E1, E2) L = range(0, 10) shuffle(L) print L L.sort(my_cmp) ———- Run Python Program ———- [5, 3, 7, 6, 2, 8, 9, 4, 1, 0] E1: 3 E2: 5 E1: 7 E2: 3 E1: 7 E2: 5 E1: 6 E2: 5 E1: 6 E2: 7 E1: 2 E2: 6 E1: 2 E2: 5 E1: 2 E2: 3 E1: 8 E2: 5 E1: 8 E2: 7 E1: 9 E2: 6 E1: 9 E2: 8 E1: 4 E2: 6 E1: 4 E2: 3 E1: 4 E2: 5 E1: 1 E2: 6 E1: 1 E2: 4 E1: 1 E2: 3 E1: 1 E2: 2 E1: 0 E2: 5 E1: 0 E2: 3 E1: 0 E2: 2 E1: 0 E2: 1 可以看到,每次调用my_cmp,E1依次是List中的第2、3、4……直到最后一个元素,可以肯定sort不是采用的分治法(devide-and-conqure) 看前三次调用,可以发现sort采用的是典型的插入排序——也就是说,将新元素插入已排序部分的合适位置,查找位置时采用的似乎是从后向前线形探察的办法。从元素6开始,新元素不再直接与已排序部分的最后元素比较,而是先与中间值比较,采用二分检索探察合适位置,这样,可以把时间代价从n缩小到log(n)。 至此,我们可以认为,built-in的sort方法,采用的是“二分法插入排序”(binary insertion)的算法。 为了检测这个结论,可以输入一个已排序的数组,看看结果。 L = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10] L.sort(my_cmp) ———- Run Python Program ———- E1: 1 E2: 0 E1: 2 E2: 1 E1: 3 E2: 2 E1: 4 E2: 3 E1: 5 E2: 4 E1: 6 E2: 5 E1: 7 E2: 6 E1: 8 E2: 7 E1: 9 E2: 8 E1: 10 E2: 9 结果发现,比较的次数非常少,插入每个元素的时候,只会与它之前紧邻的元素比较,而不是二分检索。这真是个有意思的现象。 改一改程序 L = [0, 1, 2, 3, 4, 5, 6, 8, 7, 9, 10] L.sort(my_cmp) ———- Run Python Program ———- E1: 1 E2: 0 E1: 2 E2: 1 E1: 3

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档