本文实例讲述了Python实现的堆排序算法。分享给大家供大家参考,具体如下:
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。
具体代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
|
#-*- coding: UTF-8 -*-
import numpy as np
def MakeHeap(a):
for i in xrange (a.size / 2 - 1 , - 1 , - 1 ): #对非叶子节点的子节点进行调节,构建堆
AdjustHeap(a, i, a.size)
def AdjustHeap(a, i, n):
j = i * 2 + 1 #选择节点i的左子节点
x = a[i] #选择节点的数值
while j < n: #循环对子节点及其子树进行调整
if j + 1 < n and a[j + 1 ] < a[j]: #找到节点i子节点的最小值
j + = 1
if a[j] > = x : #若两个子节点均不小于该节点,则不同调整
break
a[i], a[j] = a[j], a[i] #将节点i的数值与其子节点中最小者的数值进行对调
i = j #将i赋为改变的子节点的索引
j = i * 2 + 1 #将j赋为节点对应的左子节点
def HeapSort(a):
MakeHeap(a) #构建小顶堆
for i in xrange (a.size - 1 , 0 , - 1 ): #对堆中的元素逆向遍历
a[i], a[ 0 ] = a[ 0 ], a[i] #将堆顶元素与堆中最后一个元素进行对调,因为小顶堆中堆顶元素永远最小,因此,输出即为最小元素
AdjustHeap(a, 0 , i) #重新调整使剩下的元素仍为一个堆
if __name__ = = '__main__' :
a = np.random.randint( 0 , 10 , size = 10 )
print "Before sorting..."
print "---------------------------------------------------------------"
print a
print "---------------------------------------------------------------"
HeapSort(a)
print "After sorting..."
print "---------------------------------------------------------------"
print a[:: - 1 ] #因为堆排序按大到小进行排列,采用a[::-1]对其按从小到大进行输出
print "---------------------------------------------------------------"
|
运行结果:
希望本文所述对大家Python程序设计有所帮助。
原文链接:http://www.cnblogs.com/biaoyu/p/4831640.html