python 排序(二)堆排序

一、简介

:堆栈是计算机的两种最基本的数据结构,堆的特点是先进先出,栈是后进先出。堆其实可以理解成树的结构。堆在接受数据时先接收的数据会被先弹出。栈处于一级缓存而堆处于二级缓存中。

       堆是一颗顺序存储的完全二叉树,有大根堆和小根堆。

       大根堆:每个结点的key不小于其孩子结点的key,反之则是小根堆

堆排序的思想:本质是使用大根堆或小根堆来对一个数组进行排序

操作步骤:

以由对数组从小到大进行排序的情况,需要构建大根堆。

1.首先将整个数组进行构建一个大根堆得到[0,R1,....,Rn](具体实现后面讲)

2.由于R1是最大的数,所以把R1与Rn改变位置,变成[0,Rn,...,Rn-1,R1],此时[0,Rn...,Rn-1]是无序的,[R1]是有序的

3.对数组[0,Rn...,Rn-1]进行重构大根堆,得到[0,R2,....,Rn-1]

4.由于R2是最大的数,所以把R2与Rn-1改变位置,变成[0,Rn-1,...Rn-2,R2,R1],此时[0,Rn-1...,Rn-2]是无序的,[R2,R1]是有序的

5.重复以上步骤,直到无序列表只有[0],最终得到的有序序列则是按照从小到大规律排列的。

 

二、代码实现

def heapify(arr, n, i): 
    largest = i  
    l = 2 * i + 1     # left = 2*i + 1 
    r = 2 * i + 2     # right = 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 heapSort(arr): 
    n = len(arr) 
  
    # Build a maxheap. 
    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 ("排序后") 
for i in range(n): 
    print ("%d" %arr[i]),
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值