数据结构--堆排序及Python实现

1. 堆: 是一种顺序结构存储的完全二叉树。

2. 大根堆: 根结点的关键字不小于孩子结点的关键字。(从小到大排序)

    小根堆:根结点的关键字不大于孩子结点的关键字。 (从大到小排序)

3. 堆的构建:

       从最后一个非叶子结点(数组中编号为 i= len(arr)//2 -1 )开始,从下到上,从右到左开始调整。以大根堆为例,如果第i 个结点的孩子结点(左孩子结点的编号为k=2*i+1, 右孩子结点的编号为k+1)比它大,则进行交换;否则,不交换。再从第二个非叶子结点开始,进行调整,直到调整到根结点为止。

4. 堆排序:

       先将待排记录调整为堆,再将堆顶元素与末尾元素进行交换,将交换后的末尾元素沉到待排序的末尾;然后,将剩余元素调整为堆,将堆顶元素与末尾元素进行交换,如此反复,直到最后两个待排元素交换为止。

5. 复杂度

平均时间最好最差空间复杂度稳定性
O(nlogn)O(nlogn)O(nlogn)O(1)不稳定

6. Python实现

def HeapSort(arr):
    s = len(arr)
    i = len(arr)//2 - 1  # 非叶子结点的位置
    # 初次建立堆
    for k in range(i,-1, -1):
        ajustHeap(arr, k, s)
    # 交换元素和调整堆
    for j in range(s-1, 0, -1):
        arr[j], arr[0] = arr[0], arr[j]
        adjustHeap(arr, 0, j)
# 定义adjustHeap函数
def adjustHeap(arr, cur, heaplen):
    temp = arr[cur] # 记录当前位置的值
    k = cur*2+1   #当前位置的左孩子结点
    while k < heaplen:
        # 左孩子结点的值小于右孩子结点的值,指向右孩子结点
        if k+1 < heaplen and arr[k] < arr[k+1]:
            k += 1 
        # 当前位置的值小于孩子结点进行交换
        if arr[cur] < arr[k]:
            arr[cur] = arr[k]
            cur = k
        k = k*2 + 1
    arr[cur] = temp
    


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值