Python最大堆排序实现方法,具体代码如下:
 
# -*- coding: utf-8 -*-
 
def merge_sort(seq, cmp=cmp, sentinel=None):
    """合并排序,伪码如下:
    MERGE(A, p, q, r)
    1  n1 ← q - p + 1 // 前个子序列长度
    2  n2 ← r - q // 后个子序列长度
    3  create arrays L[1..n1+1] and R[1..n2+1] // 创建两数组
    4  for i ← 1 to n1 // 复制前n1个进L
    5    do L[i] ← A[p+i-1]
    6  for j ← 1 to n2 // 复制后n2个进R
    7    do R[j] ← A[q+j]
    8  L[n1+1] ← ∞ // 哨兵值,避免判断
    9  R[n2+1] ← ∞ // sentinel value
    10 i ← 1 // 重置
    11 j ← 1
    12 for k ← p to r // 从首个开始遍历
    13   do if (L[i] <= R[j]) // 比较L与R的最小元素(<=)
    14        then A[k] ← L[i] // L的小时,赋值进A
    15             i ← i + 1 // L后移一位
    16        else A[k] ← R[j] // R的小时,赋值进A
    17             j ← j + 1 // R后移一位
 
    T(n) = θ(n*lgn)
 
    Args:
        seq (Sequence): 一个序列对象。
        cmp (Function): 比较函数。默认为内建函数cmp()。
        sentinel (object): 哨兵值,比较时永远最大。
 
    Returns:
        排序后的序列。
    """
    if (seq == None):
        return None
    if sentinel == None:
        import sys
        sentinel = sys.maxint
 
    p = 0
    r = len(seq) - 1
    q = (r - p) / 2 + p # 奇数时,前子序列多得一项
    # assert p >= 0 and r < len(seq) and p <= q <= r, 'p, q, r unavailable'
 
    def merge(seq, p, q, r):
        n1 = q - p + 1 # 前个子序列长度
        n2 = r - q # 后个子序列长度
 
        if p == q: # 即,n1 == 1 and n2 == 1。前提:在奇数时,前子序列多得一项。
            # 都为1项时,直接比较设值。当然,用以下方式,直接用合并步骤也可以的。
            x, y = seq[p], seq[q+1]
            if cmp(x, y) <= 0:
                seq[p] = x
                seq[q+1] = y
            else:
                seq[p] = y
                seq[q+1] = x
            return
        else:
            # if n1 > 1: # 由于现在明确n1>=n2,这里可以不加这一判断。
            merge(seq, p, (q - p) / 2 + p, q)
            if n2 > 1:
                merge(seq, q + 1, (r - q - 1) / 2 + q + 1, r)
 
        # 合并步骤
 
        L, R = [], []
        for i in range(n1):
            L.append(seq[p+i])
        for j in range(n2):
            R.append(seq[q+j+1])
        L.append(sentinel)
        R.append(sentinel)
 
        i, j = 0, 0
        for k in range(p, r+1):
            x, y = L[i], R[j]
            if cmp(x, y) <= 0:
                seq[k] = x
                i = i + 1
            else:
                seq[k] = y
                j = j + 1
 
    if (r - p + 1 > 1):
        merge(seq, p, q, r)
 
    return seq
 
if __name__ == '__main__':
    import random, timeit
 
    items = range(10000)
    random.shuffle(items)
 
    def test_sorted():
        print(items)
        sorted_items = sorted(items)
        print(sorted_items)
 
    def test_merge_sort():
        print(items)
        sorted_items = merge_sort(items)
        print(sorted_items)
 
    test_methods = [test_sorted, test_merge_sort]
    for test in test_methods:
        name = test.__name__ # test.func_name
        t = timeit.Timer(name + '()', 'from __main__ import ' + name)
        print(name + ' takes time : %f' % t.timeit(1))  转载请注明论文发表http://www.400qikan.com

转载于:https://www.cnblogs.com/vdtte/p/3222816.html

Python最大堆排序实现方法相关推荐

  1. python中堆排序_Python实现堆排序的方法详解

    本文实例讲述了Python实现堆排序的方法.分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是 ...

  2. [转载] python实现堆排序用类的方法_python实现堆排序的实例讲解

    参考链接: 用Python进行堆排序heap sort 堆排序 堆是一种完全二叉树(是除了最后一层,其它每一层都被完全填充,保持所有节点都向左对齐),首先需要知道概念:最大堆问题,最大堆就是根节点比子 ...

  3. Python 字典(Dictionary) get()方法

    Python 字典(Dictionary) get()方法 描述 Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: ...

  4. 刻意练习:Python基础 -- Task11. 魔法方法

    背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...

  5. python操作yaml的方法详解

    这篇文章主要为大家介绍了python操作yaml的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助 一.参考链接 https://pyyaml.org/wiki/PyYAM ...

  6. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  7. python集合(set)+常见方法+交叉并补

    python集合(set)+常见方法+交叉并补 集合的定义 定义:由不同元素组成的集合,集合是一组无序排列 可hash值,可作为字典的key. 特性:集合的目的是将不同的值存放在一起,不同的集合间用来 ...

  8. python print 的使用方法

    python print 的使用方法 视频 https://www.bilibili.com/video/BV1mK4y187zN?from=search&seid=3961255759492 ...

  9. python加号换行,Python字符串拼接六种方法介绍

    Python字符串拼接的6种方法: 1.加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用"+"来连接两个字符串: prin ...

最新文章

  1. 开发腾讯移动游戏平台SDK ios版Ane扩展 总结
  2. NSBundle介绍
  3. 【Scratch】青少年蓝桥杯_每日一题_7.09_加减大师
  4. 温州大学《机器学习》课程课件(十一、降维)
  5. 工业机器人码垛教学实施_工业码垛机器人存在问题与解决对策
  6. 产品经理之市场需求分析详解(非原创)
  7. LINUX下FORK的运行机制详细解析
  8. linux下ssh/sftp配置和权限设置
  9. 视觉SLAM十四讲第一讲
  10. navicat 创建模型
  11. dcn网络与公网_DCN网络安全分析
  12. 《数据结构》-树(孩子兄弟表示法)
  13. 中国象棋纯CSS版--冰极峰
  14. 2020线上中国国际智能产业博览会区块链高峰论坛重庆举行
  15. 投屏电视显示无法连接服务器,无法连接服务器.怎么办?
  16. 键入传真服务器位置是什么意思,2014传真服务器主要功能与技术参数说明.doc
  17. 关于SQL Server numeric数据类型介绍
  18. 软件项目经理,如何确保项目管理三大目标(质量、进度、成本)的达成?
  19. mvn compile报错“程序包com.XXX不存在”
  20. 合同法律风险管理 合同签字后果

热门文章

  1. Distinction Between Strategy and Decorator
  2. iOS 应用发布到AppStore流程
  3. MySQL数据类型--------字符串类型实战
  4. C# 值类型与引用类型
  5. codeception (4)Yii2下创建Acceptance Tests(验收测试)
  6. 共享文件时提示“将安全性信息应用到以下对象时发生错误”
  7. 基于angularJS和requireJS的前端架构
  8. (转)mxArray数据类型
  9. HDU-1203 I NEED A OFFER!-0、1背包及空间优化
  10. Mr Big [To be with you]