目录
1、关于堆的相关定义
(二叉)堆数据结构是一种数组对象,其可视为一颗完全二叉树,树的每一层都是填满的,最后一层除外(最后一层从一个结点的左子树开始填)。表示堆得数组A是一个具有两个属性的对象:length[A]是数组中的元素的个数, heap_size[A]是存放在A中的堆元素个数。就是说虽然A[1 .. length[A]]中都可以包含有效值,但A[heap_size[A]]之后的元素都不属于响应的堆。此处。
二叉堆分为两种:最大堆和最小堆。在最大堆中某个结点的值至多和其父节点的值一样大。这样,堆中最大元素就存放在根节点中。 (除根结点均满足)。最小堆则相反。
2、关于堆排序算法的基本过程
- MAX-HEAPIFY 过程,其运行时间为O(lg(n)),保持最大堆性质的关键。
- BUILD-MAX-HEAP过程,以线性时间运行,可以在无序的输入数组基础上构造出最大堆
- HEAP-SORT过程,运行时间O(n*lg(n)), 对一个数组原地排序。
综上所述,heap sort 的时间复杂度为O(n*lg(n))。
3、堆排序算法的代码实现
#!/usr/bin/pyenv python
# This is a example for Heap Sort
import math
class heap:
# initial the parameter for the heap
def __init__(self, A):
self.list = A[:]
self.heapSize = len(self.list)
# print self.heapSize
# calculate the left & right child and the parent for given element
def left(self, i):
return 2 * (i + 1) - 1
def right(self, i):
return 2 * (i + 1)
def parent(self, i):
return math.floor((i - 1)/ 2)
# change the i and j position
def exchange(self, i, j):
temp = self.list[i]
self.list[i] = self.list[j]
self.list[j] = temp
# To make the heap be a legal max-heap
def max_Heapify(self, i):
l = self.left(i)
r = self.right(i)
largest = i
if l < self.heapSize and self.list[largest] < self.list[l]:
largest = l
if r < self.heapSize and self.list[largest] < self.list[r]:
largest = r
if not largest == i:
self.exchange(i, largest)
self.max_Heapify(largest)
# Using the array to build a max heap
def buil_Max_Heapify(self):
for i in range(self.heapSize / 2, -1, -1):
self.max_Heapify(i)
# sort algorithms
def heapSort(self):
for i in range(self.heapSize - 1, 0, -1):
self.exchange(0, i)
self.heapSize -= 1
self.max_Heapify(0)
if __name__ == '__main__':
A = [1, 7, 2, 6, 5, 10, 3, 0, 8]
obj = heap(A)
obj.buil_Max_Heapify()
print obj.list
obj.heapSort()
print obj.list