016.【排序算法】堆排序法

1. 堆排序法

堆排序是指利用堆这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父结点。从这句话来看,堆有两个条件:

(1)是一个完全二叉树

(2)子结点的键值或索引总是小于(或者大于)它的父结点

2. 使用堆排序法为列表中的数字进行递增排序

具体代码如下:

''''
函数名称:heapify
功能:调整列表中的元素并保证以i为父结点的堆,并保证i是最大值
参数说明:	heap:表示堆
         	heap_len:表示堆的长度
         	i:表示父结点的位置
'''

def heapify(heap,heap_len,i):
'''
    给定某个结点的下标i,这个结点的父节点、左子结点、右子结点的下标都可以被计算出来
    父结点:(i-1)//2
    左子结点:2*i + 1
    右子结点:2*i + 2  即:左子节点 + 1
    '''

    left = 2*i + 1                	# 左子结点位置
    right = 2*i + 2               	# 右子结点位置
    larger = i                  	# 每次最大值赋给变量larger
    # 左结点位置小于堆长度同时堆的最大值小于左子结点的值
    if left < heap_len and heap[larger] < heap[left]:
        larger = left            	# 此时将左结点位置给larger
    # 右结点位置小于堆长度同时堆的最大值小于右子结点的值
    if right < heap_len and heap[larger] < heap[right]:
        larger = right       		# 此时将右结点位置给larger
    if larger != i:            		# 如果做了堆调整则larger的值等于左节点或者右节点的值
        heap[larger], heap[i] = heap[i], heap[larger] 		# 这个时候做堆调整操作
        # 递归对各分支做调整
        heapify(heap, heap_len, larger)


def build_heap(heap):           	# 构造一个堆,将堆中所有数据重新排序
    heap_len = len(heap) 			# heapSize是堆的长度
    for i in range((heap_len -2)//2,-1,-1):              	# 自底向上建堆
        heapify(heap, heap_len, i)

def heap_sort(heap):             	# 将根节点取出与最后一位做对调,对前面len-1个节点继续进行堆调整过程
    build_heap(heap)            	# 调用函数创建堆
    # 调整后列表的第一个元素就是这个列表中最大的元素,将其与最后一个元素交换,然后将剩余的列表再递归的调整为最大堆
    for i in range(len(heap)-1, -1, -1):
        heap[0], heap[i] = heap[i], heap[0]
        heapify(heap, i, 0)

 
data = [96,54,88,5,10,12]
print("原始数据为:")
for k in range(6):                      					# 遍历原有数据
    print('%4d'%data[k],end='')       						# 输出结果

print('\n---------------------------')
print("排序之后的结果为:")
heap_sort(data)
for k in range(6):                  						# 遍历排序后数据
    print('%4d'%data[k],end='')       						# 输出结果

猜你喜欢

转载自blog.csdn.net/qq_42226855/article/details/131228034