python算法--堆排序详细实现
2013-05-09 22:53
627 查看
堆排序的时间复杂度也 O(nlog n),而且只需要一个记录大小的辅助空间。
对n个元素的序列 {k1, k2, ..., kn},若将此序列看成是一个完全二叉树,若 对所有节点,其关键字均恒小于(或大于)左右孩子的关键字,则称该序列为堆。
使用堆排序,无非就是两步:1、建立堆 2、取出堆顶元素之后调整序列为新堆。
调整:
输出堆顶元素之后,将最后的元素放在堆顶(即k0)的位置,然后从 0 号节点开始,向下调整。如果节点和左右孩子节点相比不是最小的,则将较小的孩子节点与之
交换。交换之后,可能会破坏子树的堆属性,所以需要从交换的孩子节点处向下循环查找比较,直至子树满足堆属性或者到达叶子节点。
建堆:
将序列看成是一个完全二叉树,则二叉树的最后一个非终端节点即为第 n/2 个元素。所以,从第 n/2 个元素开始调整即可,依次是 n/2 - 1, n/2 - 2 ,......,0. 调整过程与上面是一样的。
完整代码如下:
运行效果:
对n个元素的序列 {k1, k2, ..., kn},若将此序列看成是一个完全二叉树,若 对所有节点,其关键字均恒小于(或大于)左右孩子的关键字,则称该序列为堆。
使用堆排序,无非就是两步:1、建立堆 2、取出堆顶元素之后调整序列为新堆。
调整:
输出堆顶元素之后,将最后的元素放在堆顶(即k0)的位置,然后从 0 号节点开始,向下调整。如果节点和左右孩子节点相比不是最小的,则将较小的孩子节点与之
交换。交换之后,可能会破坏子树的堆属性,所以需要从交换的孩子节点处向下循环查找比较,直至子树满足堆属性或者到达叶子节点。
建堆:
将序列看成是一个完全二叉树,则二叉树的最后一个非终端节点即为第 n/2 个元素。所以,从第 n/2 个元素开始调整即可,依次是 n/2 - 1, n/2 - 2 ,......,0. 调整过程与上面是一样的。
完整代码如下:
#!/usr/bin/python # FileName: HeapSort.py # If the node has only one child def changeTwo(array, i): if array[i] > array[i*2+1]: array[i], array[i*2+1] = array[i*2+1], array[i] # If the node has two children def changethree(array, i): if array[i] > array[i*2+1] and array[i] > array[i*2+2]: if array[i*2+1] > array[i*2+2]: array[i], array[i*2+2] = array[i*2+2], array[i] return i*2+2 else: array[i], array[i*2+1] = array[i*2+1], array[i] return i*2+1 elif array[i] > array[i*2+1] and array[i] <= array[i*2+2]: array[i], array[i*2+1] = array[i*2+1], array[i] return i*2+1 elif array[i] <= array[i*2+1] and array[i] > array[i*2+2]: array[i], array[i*2+2] = array[i*2+2], array[i] return i*2+2 return None # From the node search downward, until reach the last parent node. def adjustHeap(array, i): s = len(array) last = s / 2 - 1 while i != None and i < last: i = changethree(array, i) if i == last: if s % 2 == 0: changeTwo(array, last)# last has one child else: changethree(array, last)# last has two children def heapSort(array): '''Adjust the array from it's middle item to it's first by the method adjustHeap(), and in the end it will become a heap.''' i = len(array) / 2 - 1 while i >= 0: adjustHeap(array, i) i -= 1 b = [] n = len(array) for i in range(n): array[0], array[len(array)-1] = array[len(array)-1], array[0] b.append(array.pop(len(array)-1)) adjustHeap(array, 0) return b # ------------------------Test------------------------ import random if __name__ == '__main__': a = [] for i in range(20): a.append(random.randint(0, 500)) print 'Before sort:' print a a = heapSort(a) print 'After sort:' print a
运行效果:
相关文章推荐
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- 排序算法(四)堆排序的Python实现及算法详解
- 算法 排序 python 实现--堆排序
- Josephus Problem的详细算法及其Python, Java语言的实现
- python算法--置换选择排序详细实现
- Python 实现神经网络逆向传播算法(含详细注释)
- Josephus Problem的详细算法及其Python、Java实现
- Python 快速排序 堆排序——Python实现一些算法持续更新
- logistic回归算法详细分析与Python代码实现注释
- python算法--快速排序详细实现
- python实现的 K-近邻算法代码详细解释
- python算法实现系列-堆排序
- python算法--败者树详细实现
- 算法基础:排序(四)——二叉堆、优先队列、堆排序——Python实现
- python算法和数据结构笔记--汉诺塔问题超详细递归过程图解(堆栈数据结构)
- python实现RSA加密(解密)算法
- 朴素贝叶斯分类算法的Python实现
- 聚类之均值聚类(k-means)算法的python实现
- 基于python的分词算法的实现(1) - 算法
- 堆排序原理及算法实现(最大堆)