线性排序算法-堆排序 (2)

简介: 堆是什么鬼?在学数据结构的时候,链表、堆栈、树三种数据结构印象最深刻。当时理解有误区,堆栈被当成一种结构,可能因为堆栈有同样的特性——只关心堆顶或栈顶的元素。

堆是什么鬼?

在学数据结构的时候,链表、堆栈、树三种数据结构印象最深刻。当时理解有误区,堆栈被当成一种结构,可能因为堆栈有同样的特性——只关心堆顶或栈顶的元素。

但是堆结构和栈结构不同,栈结构不关心除栈顶之外的元素,而整个堆是有结构的。本文介绍一种最小堆,利用完全二叉树结构实现。

应用:多路快排

[引至第七城市])

最小堆

首先介绍另一个概念,优先队列。元素添加到队列之后,按照元素的大小顺序,小的元素先出队列。

朴素思想是采用快速排序,选最小的。那么,出队复杂度O(1),入队复杂度二分查找O(logn)。但每次插入,都需要移动O(n)的元素。

最小堆实现

  1. 完全二叉树
  2. 父节点小于他的子节点

操作方法:添加节点(上旋)

  1. 添加到树中最后一个节点位置,完全二叉树最后一个节点位置固定。
  2. 如果小于父亲节点,那么与父亲节点交换位置,直到没有父亲节点(根节点)。

操作方法:获取最小值(下旋)

  1. 堆顶元素(二叉树的根节点)即是最小值,
  2. 将二叉树的最后一个节点放到根节点上,如果该节点小于子节点,与子节点交换,直至没有子节点。两个子节点,选择最小的子节点替换。

Python代码

利用列表List实现堆、完全二叉树,可以参考第一张图,形象化理解。

class MiniHeap(object):
    
    def __init__(self):
        self.heap = []
        self.count = 0
    def swap(self,i,j):
        tmp = self.heap[i]
        self.heap[i] = self.heap[j]
        self.heap[j] = tmp
    
    def swapUp(self,index):
        while(index>0):
            parent = (index-1)//2
            if(self.heap[parent] > self.heap[index] ):
                self.swap(parent,index)
                index = parent
            else:
                break
            
    def swapDown(self,index):
        lchild = index*2+1 # 左孩子的序号
        while lchild<self.count :# 左孩子存在
            rchild = lchild+1
            if(rchild<self.count and self.heap[rchild] < self.heap[lchild] and self.heap[rchild] < self.heap[index]  ):
                self.swap(index,rchild)
                index = rchild
                lchild = index*2+1
            elif(self.heap[lchild]<self.heap[index]):
                self.swap(index,lchild)
                index = lchild
                lchild = index*2+1
            else:
                break
                    
    def pop(self):
        assert(self.count>0)
        ret = self.heap[0]
        self.count = self.count-1
        if(self.count > 0):
            self.heap[0] = self.heap[self.count]
            self.swapDown(0)
        self.heap.pop()
        return ret
    def top(self):
        assert(self.count>0)
        return self.heap[0]
    def insert(self,item):
        self.heap.append(item)
        self.count = self.count+1
        self.swapUp(self.count-1)
目录
相关文章
|
算法 Python
数据结构算法--4堆排序
堆排序过程概述:建立大根堆,将堆顶最大元素移出并替换为末尾元素,调整保持堆性质,重复此过程直至堆为空,实现排序。时间复杂度为O(nlogn)。Python中可用heapq模块进行堆操作。
|
6月前
|
存储 算法 搜索推荐
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
专攻软考高频算法,深度解析二分查找、堆排序、快速排序核心技巧,对比九大排序算法,配套动画与真题,7天掌握45%分值模块。
272 1
软考算法破壁战:从二分查找到堆排序,九大排序核心速通指南
|
6月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
399 2
|
7月前
|
传感器 算法 Python
【电机矢量控制算法】基于线性死区补偿的永磁同步电机矢量控制算法仿真
【电机矢量控制算法】基于线性死区补偿的永磁同步电机矢量控制算法仿真
185 3
|
7月前
|
机器学习/深度学习 人工智能 算法
【多智能体编队】基于自适应控制算法非线性输入的多智能体系统编队控制研究(Matlab代码复现)
【多智能体编队】基于自适应控制算法非线性输入的多智能体系统编队控制研究(Matlab代码复现)
179 0
|
7月前
|
机器学习/深度学习 算法 数据格式
MARS算法理论和Python代码实现:用分段回归解决非线性时间序列预测问题
本文将深入探讨MARS算法的核心原理,并详细阐述其在时间序列预测任务中的应用策略与技术实现。
348 0
|
存储 搜索推荐 算法
算法系列之排序算法-堆排序
堆排序(Heap Sort)是一种基于堆数据结构的比较排序算法。它的时间复杂度为 $O(nlogn)$,并且是一种原地排序算法(即不需要额外的存储空间)。堆排序的核心思想是利用堆的性质来维护一个最大堆或最小堆,然后逐步将堆顶元素(最大值或最小值)取出,放到数组的末尾,最终得到一个有序的数组。
356 8
算法系列之排序算法-堆排序
|
算法 搜索推荐
算法之堆排序
本文介绍了堆排序算法的原理和实现,通过构建最大堆或最小堆,利用堆的性质进行高效的排序,并提供了具体的编程实现细节和示例。
158 1
算法之堆排序
|
算法 搜索推荐
数据结构与算法学习十八:堆排序
这篇文章介绍了堆排序是一种通过构建堆数据结构来实现的高效排序算法,具有平均和最坏时间复杂度为O(nlogn)的特点。
508 0
数据结构与算法学习十八:堆排序
|
算法 Java Go
深入了解堆排序算法
深入了解堆排序算法
308 1

热门文章

最新文章