python实现堆排序的三种方式
2014-05-16 15:40
609 查看
# -*- coding: utf-8 -*- """ Created on Fri May 16 14:57:50 2014 @author: lifeix """ import heapq #堆排序 #第一种实现 def Heapify(a, start, end): left = 0 right = 0 maxv = 0 left = start * 2 right = start * 2 + 1 while left <= end: maxv = left if right <= end: if a[left] < a[right]: maxv = right else: maxv = left if a[start] < a[maxv]: a[maxv],a[start] = a[start],a[maxv] start = maxv else: break left = start * 2 right = start * 2 + 1 def BuildHeap(a): size = len(a) i = (size -1) // 2; while i >= 0: Heapify(a, i, size - 1) i = i - 1 def HeapSort(a): BuildHeap(a) print 'first before sorted:', a i = len(a) - 1 while i >= 0: a[0],a[i] = a[i],a[0] Heapify(a, 0, i - 1) i = i - 1 a = [4,1,3,2,16,9,10,14,8,7] HeapSort(a) print 'first after sorted',a #第二种实现 def buildHeap(a,size): for j in range(size/2 - 1, -1,-1): adjustHeap(a,j,size) def adjustHeap(a, i, size): lchild = 2*i #i的左孩子节点序号 rchild = 2*i + 1 #i的右孩子节点序号 maxIndex = i if i < size/2: if lchild <= size and a[lchild] > a[maxIndex]: maxIndex = lchild if rchild <= size and a[rchild] > a[maxIndex]: maxIndex = rchild if maxIndex != i: a[i],a[maxIndex] = a[maxIndex], a[i] adjustHeap(a, maxIndex,size) if __name__ == "__main__": a =[4,1,3,2,16,9,10,14,8,7] b =[4,1,3,2,16,9,10,14,8,7] buildHeap(a, len(a)) print '-------------------------------------------------' print 'second before sorted',a i = len(a) - 1 while i >= 0: a[0],a[i] = a[i],a[0] buildHeap(a,i) i = i - 1 print 'second after sorted',a #python自带函数实现 heapq.heapify(b) heap = [] while b: heap.append(heapq.heappop(b)) b[:] = heap print '-------------------------------------------------' print 'sdk sorted',b
相关文章推荐
- 分别用的列表,递归,生成器三种方式创建出n个元素的斐波那契数列(Python3实现)
- 【python中二叉树的实现】python中二叉树的创建、三种方式递归遍历和非递归遍历
- 用调整法和插入法建堆的Python实现,不同建堆方式对堆排序性能的影响
- Python中实现装饰模式的三种方式
- 使用 Python 实现文件递归遍历的三种方式
- 详解python使用递归、尾递归、循环三种方式实现斐波那契数列
- NET中的三种接口实现方式
- Struts2树状菜单三种实现方式
- linux中RamDisk的三种实现方式
- Spring依赖注入(DI)的三种实现方式
- 实现JavaScript中继承的三种方式
- Run As(运行方式) 的几种代码实现方式(Python和C#)
- 三种方式实现异步socket
- 对于实现Java平台的三种方式的详细解析
- 排序算法集合(1)-Python实现的堆排序
- 实现JavaScript中继承的三种方式
- C#中实现程序开机自启动 三种方式
- Ubuntu Linux下实现QQ的三种方式
- 在gridview或datagrid中添加汇总行的三种实现方式
- 一个无聊男人的疯狂《数据结构与算法分析-C++描述》学习笔记 用C++/lua/python/bash的四重实现(7)习题2.8 随机数组的三种生成算法