Python最大堆排序实现方法
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最大堆排序实现方法相关推荐
- python中堆排序_Python实现堆排序的方法详解
本文实例讲述了Python实现堆排序的方法.分享给大家供大家参考,具体如下: 堆排序作是基本排序方法的一种,类似于合并排序而不像插入排序,它的运行时间为O(nlogn),像插入排序而不像合并排序,它是 ...
- [转载] python实现堆排序用类的方法_python实现堆排序的实例讲解
参考链接: 用Python进行堆排序heap sort 堆排序 堆是一种完全二叉树(是除了最后一层,其它每一层都被完全填充,保持所有节点都向左对齐),首先需要知道概念:最大堆问题,最大堆就是根节点比子 ...
- Python 字典(Dictionary) get()方法
Python 字典(Dictionary) get()方法 描述 Python 字典(Dictionary) get() 函数返回指定键的值,如果值不在字典中返回默认值. 语法 get()方法语法: ...
- 刻意练习:Python基础 -- Task11. 魔法方法
背景 我们准备利用17天时间,将 "Python基础的刻意练习" 分为如下任务: Task01:变量.运算符与数据类型(1day) Task02:条件与循环(1day) Task0 ...
- python操作yaml的方法详解
这篇文章主要为大家介绍了python操作yaml的方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,希望能够给你带来帮助 一.参考链接 https://pyyaml.org/wiki/PyYAM ...
- python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法
python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录
- python集合(set)+常见方法+交叉并补
python集合(set)+常见方法+交叉并补 集合的定义 定义:由不同元素组成的集合,集合是一组无序排列 可hash值,可作为字典的key. 特性:集合的目的是将不同的值存放在一起,不同的集合间用来 ...
- python print 的使用方法
python print 的使用方法 视频 https://www.bilibili.com/video/BV1mK4y187zN?from=search&seid=3961255759492 ...
- python加号换行,Python字符串拼接六种方法介绍
Python字符串拼接的6种方法: 1.加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用"+"来连接两个字符串: prin ...
最新文章
- 开发腾讯移动游戏平台SDK ios版Ane扩展 总结
- NSBundle介绍
- 【Scratch】青少年蓝桥杯_每日一题_7.09_加减大师
- 温州大学《机器学习》课程课件(十一、降维)
- 工业机器人码垛教学实施_工业码垛机器人存在问题与解决对策
- 产品经理之市场需求分析详解(非原创)
- LINUX下FORK的运行机制详细解析
- linux下ssh/sftp配置和权限设置
- 视觉SLAM十四讲第一讲
- navicat 创建模型
- dcn网络与公网_DCN网络安全分析
- 《数据结构》-树(孩子兄弟表示法)
- 中国象棋纯CSS版--冰极峰
- 2020线上中国国际智能产业博览会区块链高峰论坛重庆举行
- 投屏电视显示无法连接服务器,无法连接服务器.怎么办?
- 键入传真服务器位置是什么意思,2014传真服务器主要功能与技术参数说明.doc
- 关于SQL Server numeric数据类型介绍
- 软件项目经理,如何确保项目管理三大目标(质量、进度、成本)的达成?
- mvn compile报错“程序包com.XXX不存在”
- 合同法律风险管理 合同签字后果
热门文章
- Distinction Between Strategy and Decorator
- iOS 应用发布到AppStore流程
- MySQL数据类型--------字符串类型实战
- C# 值类型与引用类型
- codeception (4)Yii2下创建Acceptance Tests(验收测试)
- 共享文件时提示“将安全性信息应用到以下对象时发生错误”
- 基于angularJS和requireJS的前端架构
- (转)mxArray数据类型
- HDU-1203 I NEED A OFFER!-0、1背包及空间优化
- Mr Big [To be with you]