堆排序

插入

向一个原本有序的数组[1,2,……,n-2]中插入一个元素,只需要找到最后一个元素的位置,保持堆的结构,所以调整index=n的位置即可→上浮

删除

  1. 删除叶节点,直接删除
  2. 删除非叶节点i,等价于=将其与最后一个元素交换位置,再删除最后一个元素
    此时从节点i开始往下的结构,全部有可能受影响→现在节点i的节点需回到它应该在的位置,下沉

堆排序

堆排序的操作=不断的插入+删除。然而由于实际上一开始我们就拿到了全部的元素,因此一个个插入到堆的操作可以省略。

  • 建堆的操作=自下而上每个元素进行下沉。下沉既可以递归地实现(pecdown(i)=i和左右儿子比较+pecdown(i左右儿子中较小的那个))也可以用循环一步到位。
# percDown的递归实现
def percDown(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]  # 交换
  
        percDown(arr, n, largest) 
# percDown的循环实现
def percDown(arr, n, i):
    while 2 * i + 1<n:
        # largest指向左右儿子较大的那个 
        l = 2 * i + 1     # left = 2*i + 1 
        r = 2 * i + 2     # right = 2*i + 2 
        largest = i

        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]  # 交换
            i = largest 
        else:
            break

def heapSort(arr): 
    n = len(arr) 
  
    # Build a maxheap. 
    for i in range(n//2, -1, -1): # percDown会检验下标,从n开始也可
        percDown(arr, n, i) 
  
    # 一个个交换元素
    for i in range(n-1, 0, -1): 
        arr[i], arr[0] = arr[0], arr[i]   # 交换
        percDown(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])
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 关于最大堆 什么是最大堆和最小堆?最大(小)堆是指在树中,存在一个结点而且该结点有儿子结点,该结点的data域值都...
    凌云壮志几多愁阅读 88,632评论 33 71
  • 这是【字节可视化系列】堆排序的第一篇文章。同时,文末会放上一张【速记卡】,方便快速回顾本文关键知识点。 本篇的主旨...
    字节武装阅读 3,276评论 0 0
  • 1. 优先队列 说堆排序之前,我们要从一种特殊的数据结构——优先队列说起。优先队列最大的两个特征:插入元素和删除最...
    Xerrard阅读 2,726评论 0 1
  • 与简单选择排序的关系 简单选择排序过程有这个问题:在待排序的n个记录中选择一个最小的记录需要比较n-1次。这样的操...
    官先生Y阅读 3,541评论 0 1
  • HeapSort 转载自:链接://www.greatytc.com/p/719b0de606a7 ...
    须臾之北阅读 9,494评论 0 1