1.堆介绍
1.定义
堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。 时间复杂度O(nlogn)
2.堆的向下调整行
假设左右子树都是堆但自身不是堆时可以通过依次向下调整根节点来使其变成堆
3.堆排序的过程
1.建立堆
2.得到堆顶元素为最大元素
3.去掉堆顶,将最后一个元素放在堆顶此时可通过一次调整重新使堆有序
4.堆顶元素为第二大元素
5.重复步骤三直到堆变空
4.向下调整函数调整
def sift(li, low, high):
"""
:param li: 所要排序的列表
:param low: 树的根节点
:param high: 树的深度
:return:
"""
i = low # 根节点的下标
j = 2 * i + 1 # 根节点下的左孩子
temp = li[low] # 存放树的根节点
while j <= high: # 当堆内子节点小于树的深度开始遍历
if j + 1 <= high and li[j] < li[j+1]: # 判断右孩子是否越界并且判断左右孩子大小
j += 1 # 如果右孩子比左孩子大则从较大的孩子节点开始查找
if li[j] > temp: # 判断子节点是否大于根节点
li[i] = li[j] # 将根节点换为子节点
i = j # 将根节点指针变更为子节点指针
j = 2 * i + 1 # 将子节点指针变更为当前根节点下级的子节点
else:
break
else:
li[i] = temp # 当temp的值放在叶子节点上
5.构建堆
import random
def sift(li, low, high):
"""
:param li: 所要排序的列表
:param low: 树的根节点
:param high: 树的深度
:return:
"""
i = low
j = 2 * i + 1
tmp = li[low]
while j <= high:
if j + 1 <= high and li[j + 1] > li[j]:
j = j + 1
if li[j] > tmp:
li[i] = li[j]
i = j
j = 2 * i + 1
else:
break
else:
li[i] = tmp
def heap_sort(li):
n = len(li)
for i in range((n - 2) // 2, -1, -1):
# i表示建堆的时候调整的部分根节点下标
sift(li, i, n - 1)
print('堆构建完成{}'.format(li))
List = [i for i in range(100)]
random.shuffle(List)
print(List)
heap_sort(List)
6.实现堆排序
import random
def sift(li, low, high):
"""
:param li: 所要排序的列表
:param low: 树的根节点
:param high: 树的深度
:return:
"""
i = low
j = 2 * i + 1
tmp = li[low]
while j <= high:
if j + 1 <= high and li[j + 1] > li[j]:
j = j + 1
if li[j] > tmp:
li[i] = li[j]
i = j
j = 2 * i + 1
else:
break
else:
li[i] = tmp
def heap_sort(li):
n = len(li)
for i in range((n - 2) // 2, -1, -1):
# i表示建堆的时候调整的部分根节点下标
sift(li, i, n - 1)
print('堆构建完成{}'.format(li))
for i in range(n-1, -1, -1):
li[0], li[i] = li[i], li[0]
sift(li, 0, i - 1)
List = [i for i in range(100)]
random.shuffle(List)
print(List)
heap_sort(List)
print(List)