基于python实现堆排序

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)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
堆排序是一种排序算法,它基于二叉堆的数据结构堆排序的时间复杂度为O(nlogn),空间复杂度为O(1)。 以下是使用Python实现堆排序的代码: ``` def heapify(arr, n, i): largest = i l = 2 * i + 1 # left child r = 2 * i + 2 # right child if l < n and arr[i] < arr[l]: largest = l if r < n and arr[largest] < arr[r]: largest = r if largest != i: arr[i],arr[largest] = arr[largest],arr[i] heapify(arr, n, largest) def heapSort(arr): n = len(arr) for i in range(n, -1, -1): heapify(arr, n, i) for i in range(n-1, 0, -1): arr[i], arr[0] = arr[0], arr[i] heapify(arr, i, 0) arr = [12, 11, 13, 5, 6, 7] heapSort(arr) n = len(arr) print("Sorted array is") for i in range(n): print("%d" %arr[i]), ``` 在上面的程序中, `heapify()`函数用于维护堆的性质,该函数接受一个数组、一个数组的长度和一个索引值作为输入,其中i是当前的根节点。函数使用largest变量存储具有最大值的索引。然后可以通过比较左子节点和右子节点来确定largest的值。当largest变量的值不等于i时,表示最大或最小值被修改,此时需要在子树中递归堆排列以保持堆结构的性质。 在` heapSort()`函数中,对于给定输入数组,首先通过遍历所有非叶子节点来构建一个最大堆 ,其余所有的节点都满足最大堆的性质。 然后对于每个元素,将它移至堆的底部,逐步进行堆排列以保证根节点是堆的最大值。 在完成第一个元素后,我们可以只对余下的元素执行相同的操作,从而获得排序的数组。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值