Python 实现经典算法之堆排序

Python 实现经典算法之堆排序简介堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或

欢迎大家来到IT世界,在知识的湖畔探索吧!

简介

堆排序(Heapsort)是指利用这种数据结构所设计的一种排序算法。

堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆排序可以说是一种利用堆的概念来排序的选择排序

特点

  • 堆:一种特殊的完全二叉树结构
  • 大根堆:一棵完全二叉树,满足任一节点都比其孩子节点大
  • 小根堆:一棵完全二叉树,满足任一节点都比其孩子节点小
Python 实现经典算法之堆排序

堆排序节点访问

在这里我们借用wiki的定义来说明:

通常堆是通过一维数组来实现的。在阵列起始位置为0的情况中

父节点i的左子节点在位置:(2*i+1);

父节点i的右子节点在位置:(2*i+2);

子节点i的父节点在位置:(i-1)//2;

执行步骤

  1. 构建堆:将待排序序列构建成一个堆 H[0……n-1],从最后一个非叶子结点开始,从左至右,从下至上进行调整。根据升序或降序需求选择大顶堆或小顶堆;
  2. 此时的堆顶元素,为最大或者最小元素;
  3. 把堆顶元素和堆尾元素互换,调整堆,重新使堆有序;
  4. 此时堆顶元素为第二大元素;
  5. 重复以上步骤,直到堆变空。

动图演示

Python 实现经典算法之堆排序

实例代码

##### 今日头条:技术好奇心##### 构建维护堆def heapify(arr, n, i):    # 最大位置    largest = i    # left = 2*i + 1    l = 2 * i + 1    # right = 2*i + 2    r = 2 * i + 2    # 比较父节点与左孩子大小    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 heap_sort(arr):    # 数组长度    n = len(arr)    # 构建大顶堆,由下往上构建所以用-1    for i in range(n, -1, -1):        heapify(arr, n, i)    print('--------- 构建之后的数组内容 ----------')    print(arr)    # 一个个交换元素    for i in range(n - 1, 0, -1):        # 交换        arr[i], arr[0] = arr[0], arr[i]        # 维护交换后的堆        heapify(arr, i, 0)if __name__ == "__main__":    print('今日头条:技术好奇心')    print('----------- 排序前数组内容 -----------------')    arr = [2, 7, 26, 25, 19, 17, 1, 90, 3, 36]    print(arr)    heap_sort(arr)    print('------------ 排序后的结果 ------------------')    print(arr)

欢迎大家来到IT世界,在知识的湖畔探索吧!

运行结果:

欢迎大家来到IT世界,在知识的湖畔探索吧!今日头条:技术好奇心
----------- 排序前数组内容 -----------------
[2, 7, 26, 25, 19, 17, 1, 90, 3, 36]
------------ 排序后的结果 ------------------
[1, 2, 3, 7, 17, 19, 25, 26, 36, 90]

Python 实现经典算法之堆排序

相关文章

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/37425.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信