堆排序的两种方法实现(Python)以及面试中关于堆排序的相关题目

07堆排序 C和 python 💖💖感谢各位观看这篇文章,💖💖点赞💖💖、收藏💖💖、你的支持是我前进的动力!💖💖 💖💖感谢你的阅读💖,专栏文章💖持续更新!💖关注不迷路!!💖 文章目录 堆 堆排序算法 建堆 堆排序 c 代码 python 代码 堆排序复杂度 堆排序的应用:TopK算法 应用 参考 阅读详情

目录

一、堆排序的两种做法

1、堆排序的第一种做法

2、堆排序的第二种做法:(掌握)

二、面试的相关题目

1、最小的k个数

2、数组中的第 K 个最大元素

3、前 K 个高频元素 


一、堆排序的两种做法

对堆排序完全没有了解的同学,可以先看一下B站上的这个视频

https://www.bilibili.com/video/BV1Eb41147dK/

同时,堆排序的第一种做法也是基于这个视频的。

1、堆排序的第一种做法

def heapify(arr,n,i):
    large = i #父节点的下标为i
    left_child = 2*i+1 #左孩子下标
    right_child = 2*i+2
    if left_child<n and arr[left_child]>arr[large]:#如果左孩子的值大于父节点的值,将下标互换
        large = left_child
    if right_child<n and arr[right_child]>arr[large]:
        large = right_child
    if large != i:#如果下标换了,将最大子节点和父节点的值互换
        arr[large],arr[i] = arr[i],arr[large]
        heapify(arr,n,large)#将最大值的那个子树继续递归
 
def build_heap(arr,n):
    last_child = n-1
    last_parent = (last_child-1)//2 #从最后一个叶子节点的父节点开始以此向上调整
    for i in range(last_parent,-1,-1):
        heapify(arr,n,i)
 
def heap_sort(arr,n):
    build_heap(arr,n)
    for i in range(n-1,-1,-1):
        arr[0],arr[i] = arr[i],arr[0] #每次将最大的节点(根节点)与最后一个节点交换,然后去掉最后一个节点,继续调整为最大堆
        heapify(arr,i,0)
    return arr
arr = [0, 8, 6, 2, 4, 9, 1, 4, 6]
n = len(arr)
res = heap_sort(arr,n)
print(res)

2、堆排序的第二种做法:(掌握)

def heapify(arr):
    n = len(arr)
    for i in range(n//2,-1,-1):
        shiftDown(arr,n,i)

def shiftDown(arr, n, k):
    while 2 * k + 1 < n:
        j = 2 * k + 1
        if j + 1 < n and arr[j + 1] > arr[j]: #保证右孩子不超过数组长度,同时找出左右孩子中最大的那个孩子。这里大顶堆用>, 小顶堆用<
            j += 1  #如果右孩子大于左孩子,就使得使得j指向最大的那个元素,即指向右孩子
        if arr[k] >= arr[j]: #如果左孩子是最大的那个元素,但是父节点又大于左孩子,这样就满足大顶堆条件,就不需要换,直接退出即可。同样的,大顶堆用>=, 小顶堆用<=·
            break
        arr[k], arr[j] = arr[j], arr[k] #将最大的子节点和父节点互换
        k = j #互换后它的子树可能就不满足大顶堆,所以将子节点的下标赋值给父节点,继续循环,保证它的子树也是大顶堆  5


def heapSort(arr):
    n=len(arr)
    heapify(arr)
    print("堆化:",arr)
    for i in range(n-1):
        arr[n-i-1],arr[0] = arr[0],arr[n-i-1]
        # print("交换最小值后:",arr)
        shiftDown(arr,n-i-1,0)
        # print("调整后:",arr)


arr = [3,2,1,9,4,7,8]
heapSort(arr)
print("排序后:",arr)

二、面试的相关题目

1、最小的k个数

这道题可以使用堆排序,不过如果在面试的时候,面试官一般是希望使用快排来完成,下面就写出这两种写法:

堆排序的第一种方法实现:

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:     
        n = len(arr)
        self.build_heap(arr, n)
        pos = k
        for i in range(n - 1, pos-1, -1):
            arr[0], arr[i] = arr[i], arr[0]  # 每次将最大的节点(根节点)与最后一个节点交换,然后去掉最后一个节点,继续调整为最大堆
            self.heapify(arr, i, 0)
        return arr[:k]

    def heapify(self, arr, n, i):
    
        large = i  # 父节点的下标为i
        left_child = 2 * i + 1  # 左孩子下标
        right_child = 2 * i + 2
        if left_child < n and arr[left_child] > arr[large]:  # 如果左孩子的值大于父节点的值,将下标互换
            large = left_child
        if right_child < n and arr[right_child] > arr[large]:
            large = right_child
        if large != i:  # 如果下标换了,将最大子节点和父节点的值互换
            arr[large], arr[i] = arr[i], arr[large]
            self.heapify(arr, n, large)  # 将最大值的那个子树继续递归


    def build_heap(self,arr, n):
        last_child = n - 1
        last_parent = (last_child - 1) // 2  # 从最后一个叶子节点的父节点开始以此向上调整
        for i in range(last_parent, -1, -1):
            self.heapify(arr, n, i)

堆排序的第二种方法实现:

第二种的思路可以运用在后面的一些题目,所以也要掌握

1、取 nums 前 K 个元素建立大小为 K 的最大堆
2、剩余 k+1 到 N 个元素依次和堆顶比较,如果比堆顶小,则替换当前堆顶,并维护最大堆

3、最终数组里前k个就是最小的k个数

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        n = len(arr)
        self.build_heap(arr,k) 
        for i in range(k,n):
            if arr[0]>arr[i]:
                arr[0] = arr[i]
                self.heapify(arr,k,0)
        return arr[:k]

    def heapify(self,arr,n,i):
        while 2*i+1<n:
            j=2*i+1
            if j+1<n and arr[j+1]>arr[j]:
                j+=1
            if arr[i]>=arr[j]:
                break
            arr[i],arr[j] = arr[j],arr[i]
            i = j
    
    def build_heap(self,arr,n):
        for i in range(n//2,-1,-1):
            self.heapify(arr,n,i)

快速排序的实现:(重点掌握)

class Solution:
    def smallestK(self, arr: List[int], k: int) -> List[int]:
        if k>=len(arr):
            return arr
        low = 0
        high = len(arr)-1 
        while low<high:
            index = self.partition(arr,low,high)
            if index == k-1:
                break
            if index<k-1:
                low = index+1
            else:
                high = index-1
        return arr[:k]
        
                
    def partition(self,num,low,high):
        temp = num[low]
        while low<high:
            while low<high and temp<=num[high]:
                high-=1
            num[low] = num[high]
            while low<high and temp>=num[low]:
                low+=1
            num[high] = num[low]
        num[low]=temp
        return low

2、数组中的第 K 个最大元素

堆排序,这里还是使用第二种写法的思路,不过这次要换成最小堆。

注意:前 k 大,用小根堆,求前 k 小,用大根堆

思路:

1、取 nums 前 K 个元素建立大小为 K 的最小堆
2、剩余 k+1 到 N 个个元素依次和堆顶比较,如果比堆顶大,则替换当前堆顶,并维护最小堆
3、最终最小堆里是前 K 大的元素,堆顶为前 K 大的元素中最小的元素,即 Kth 大的元素

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        n = len(nums)
        self.heapify(nums,k)
        for i in range(k,n):
            if nums[0]<nums[i]:
                nums[0] = nums[i]
                self.shift(nums,k,0)
        return nums[0]

    def heapify(self,arr,k):
        for i in range(k//2,-1,-1):
            self.shift(arr,k,i)
    def shift(self,arr,n,i):
        while 2*i+1<n:
            j = 2*i+1
            if j+1<n and arr[j+1]<arr[j]:
                j+=1
            if arr[i]<=arr[j]:
                break
            arr[i],arr[j] = arr[j],arr[i]
            i = j

快速排序实现:

题目说的是数组排序后的第k个最大的元素,如果按照升序排序的话,那么从右边往左边数第 k 个元素(从 11 开始),那么从左向右数就是 len(arr)-k

所以快排的一般写法如下:

class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        left = 0
        right = len(nums)-1
        target = len(nums)-k
        while True:
            index = self.partition(nums,left,right)
            if index==target:
                return nums[index]
            if index<target:
                left = index+1
            else:
                right = index-1
    def partition(self,nums,left,right):
        temp = nums[left]
        while left < right:
            while left<right and temp<=nums[right]:
                right-=1
            nums[left]=nums[right]
            while left<right and temp>=nums[left]:
                left+=1
            nums[right] = nums[left]
        nums[left] = temp
        return left

这样运行是可以通过的,但是时间却很慢

这是由于测试用例会出现极端的例子,如顺序和逆序,这样快排的复杂度就变成了O(n²),所以对快排进行一下优化

就是对 temp 随机挑选,仔细看partition的实现。

import random
class Solution:
    def findKthLargest(self, nums: List[int], k: int) -> int:
        left = 0
        right = len(nums)-1
        target = len(nums)-k
        while True:
            index = self.partition(nums,left,right)
            if index==target:
                return nums[index]
            if index<target:
                left = index+1
            else:
                right = index-1
    def partition(self,nums,left,right):
        random_index = random.randint(left, right)
        nums[random_index], nums[left] = nums[left], nums[random_index]

        pivot = nums[left]
        j = left
        for i in range(left + 1, right + 1):
            if nums[i] < pivot: #小于pivot的元素都被交换到前面
                j += 1
                nums[i], nums[j] = nums[j], nums[i]

        nums[left], nums[j] = nums[j], nums[left] #在之前遍历的过程中,满足 [left + 1, j] < pivot,并且 (j, i] >= pivot, 交换以后 [left, j - 1] < pivot, nums[j] = pivot, [j + 1, right] >= pivot
        return j

3、前 K 个高频元素

这道题用一般的解法是可以写出来的,代码如下,代码很简单,就不做解释了

class Solution:
    def topKFrequent(self, nums: List[int], k: int) -> List[int]:
        
        dict = {}
        for i in nums:
            if i not in dict:
                dict[i] = 1
            else:
                dict[i] += 1
        dict_sort = sorted(dict.items(), key = lambda x: x[1],reverse = True)
        res = []
        for i in range(k):
            res.append(dict_sort[i][0])
        return res

这道仍然可以用堆排序的第二种方法和上两题的思路:

class Solution(object):
    def topKFrequent(self, nums, k):
        """
        :type nums: List[int]
        :type k: int
        :rtype: List[int]
        """
        def shift(i,k):#维护最小堆
            while True:
                t=2*i+1
                if t >= k :
                    return
                if t+1<k and hashlist[t][1]>hashlist[t+1][1]:
                    t=t+1
                if hashlist[t][1]<hashlist[i][1]:
                    hashlist[t],hashlist[i]=hashlist[i],hashlist[t]                   
                    i=t
                else:
                    return


        #建立哈希表
        hashmap={}
        for i in nums:
            hashmap[i]=hashmap.get(i,0)+1
        #print(hashmap)
        #将哈希表转为二维列表
        hashlist=[ [key,v] for key, v in hashmap.items() ]
        #print(hashlist)
        #建立K个元素的最小堆
        for i in range(k/2,-1,-1):
            shift(i,k)
        #剩余依次和堆顶比较
        for i in range(k,len(hashlist)):
            if hashlist[i][1]>=hashlist[0][1]:
                hashlist[0]=hashlist[i]
                shift(0,k)
        return [hashlist[i][0] for i in range(k)]

 

部分代码参考:

https://leetcode-cn.com/problems/top-k-frequent-elements/solution/quan-shou-xie-jian-li-kge-yuan-su-de-zui-xiao-dui-/

https://leetcode-cn.com/problems/kth-largest-element-in-an-array/solution/partitionfen-er-zhi-zhi-you-xian-dui-lie-java-dai-/

https://www.runoob.com/python3/python-heap-sort.html

 

从零搭建一个AF架构项目:基于TIA Portal V19和S7-PLCSIM的仿真调试全流程 本文详细介绍了如何在TIA Portal V19环境中从零搭建西门子Automation Framework(AF架构)项目,包括环境准备、硬件组态、核心组件创建、项目架构分层实现以及仿真调试全流程。通过模块化编程和标准化接口设计,AF架构显著提升工业自动化项目的开发效率和维护便利性,特别适合S7-1500系列PLC的应用开发。 阅读详情

相关推荐

Xilinx/AMD公司7系列FPGA的ISERDESE2仿真的”天坑”(附verilog的源码vivado仿真工程)

研究LVDS输出接口的ADC与7系列(ZYNQ)FPGA对接过程中,在Vivado中搭建了ISERDESE2的仿真工程,仿真结果ISERDESE2的并行输出口一直输出X或Z,这个坑之大,耗费了我数天的时间,可以称为“天坑”了。同步复位的要求肯定是高于异步复位的,古话说得好“两害相权取其轻”,所以,跟古话对着干就对了!就当RST是同步复位吧,最后经过反复验证,发现。开始怀疑复位信号是否高电平持续时间不够长?但是没有查到复位时间的要求 : - (

FPGA艺术家的博客 171

排序算法总结

本节对一些简单的排序算法做了一个学习,对于个人认为比较难的对排序和基数排序,作者尚未学习完成,因此需要进一步学习的人可以参考:http://blog.youkuaiyun.com/talking12391239/article/details/9079961和http://blog.youkuaiyun.com/yangzl2008/article/details/10344065 #include using nam

hailong0715的专栏 720

【Autosar COM】Marvell 88Q5050 以太网交换机驱动技术解析

本驱动实现了对Marvell 88Q5050交换机的全面控制,通过模块化设计满足AUTOSAR规范要求。增加DMA加速机制提升大数据量处理性能实现TSN(时间敏感网络)特性支持引入异步通知机制替代轮询操作增强安全特性,如MACsec支持该驱动架构为车载以太网交换机控制提供了可靠基础,其设计思想可推广到其他车载网络控制器开发中。随着车载网络技术的演进,驱动需持续迭代以支持新特性与更高通信速率需求。

1450

python : 冒泡排序

python : 冒泡排序 def bubbleSort(arr): n = len(arr) # 遍历所有数组元素 for i in range(n): # Last i elements are already in place for j in range(0, n-i-1): if arr[j] > arr[j+1] : arr[j], arr[j+1] = arr[j+1], arr[j] arr = [64, 34, 25, 1

weixin_47009333的博客 415

【AUTOSAR-DEM】-2.4-APP SWC如何读取MIL灯状态以及配置MIL灯

该篇博文将告诉您: MIL(Malfunction Indicator Lamp/Light)灯的点灯和灭灯过程; DEM模块如何配置MIL灯; APP SWC如何获取MIL灯状态。

「汽车电子助手」的博客 1712

RT-DETR训练自己的数据集(从代码下载到实例测试)

在Windows10上配置CUDA环境教程是百度提出的一种实时目标检测模型。RT-DETR采用了与DETR相同的编码器和解码器结构,但对其进行了大量的优化,在保持较高检测精度的同时,实现了实时目标检测,为目标检测领域提供了一种新的有效解决方案,具有广泛的应用前景,如自动驾驶、智能监控、机器人等领域。以上是RT-DETR官方的论文和代码,详细介绍了RT-DETR的构成和实现。在YOLOv10中也实现了RT-DETR的代码,所以本文使用YOLOv10的项目文件进行RT-DETR的训练和测试。YOLOv10。

Limiiiing的博客 4万+

python实现常见的排序算法

# coding: utf-8 """常见排序算法正序实现""" def bubble_sort(arr): """ 冒泡排序:稳定排序,最差和平均时间复杂度O(n^2),最优情况是O(n),即原数组是已排好序的情况,空间复杂度O(1),即交换操作时使用的临时空间 实现:比较相邻元素,将较小的放在前面,重复执行,直到所有元素满足正序。 """ n = len(arr) for i in range(0, n): # 表示排序的轮次 is.

缘来如此 8786

做cellchat画图时自环的角度颠倒,如何解决?

🏆本文收录于 《全栈 Bug 调优(实战版)》 专栏。专栏聚焦真实项目中的各类疑难 Bug,从成因剖析 → 排查路径 → 解决方案 → 预防优化全链路拆解,形成一套可复用、可沉淀的实战知识体系。无论你是初入职场的开发者,还是负责复杂项目的资深工程师,都可以在这里构建一套属于自己的「问题诊断与性能调优」方法论,助你稳步进阶、放大技术价值 。

**My Coding Family** 463

Python 排序算法

不同的排序算法各有优缺点,选择适合的排序算法可以提高程序效率。对于小规模的数据排序,选择冒泡排序、插入排序或选择排序即可。对于大规模的数据排序,选择快速排序或归并排序更为合适。在实际应用中,根据数据特点和需求选择不同的排序算法,可以达到最优的排序效果。本文介绍了 Python 中几种常见的排序算法,包括冒泡排序、插入排序、选择排序、快速排序和归并排序。对每种算法的优缺点进行了比较,提供了在实际应用中选择不同算法的建议。

挨踢二天才 247

DO-254标准详解:航空电子硬件设计保证指南全方位解析

RTCA DO-254, 也被称为《机载电子硬件设计保证指南》,是航空电子硬件设计和验证中的关键标准,旨在为确保机载电子硬件的安全性提供设计保证。自2000年首次发布以来,DO-254就成为了民航和军用飞机中电子硬件设计认证的基准文件。随着航空硬件技术的进步和日益复杂化,确保硬件设计的准确性、可靠性和安全性变得至关重要。本标准是由RTCA和EUROCAE共同开发的,适用于涉及机载硬件的航空公司、飞机制造商、供应商和认证机构。

qq_41854911的博客 3682

基于STM32+华为云IOT设计的云平台监控系统_102

本次设计结合现代生活的具体需求,设计出一套基于华为云IOT设计的云平台监控系统,可以远程实时查看家里光照强度、温湿度等信息,支持在云端控制家里的电器设备,实现远程控制。

7643

数据结构 —— 堆

堆 “堆”(Heap),实际上就是一种特殊的树。 什么样的树才是堆?需要满足两个条件 一、 堆是一个完全二叉树; 二、 堆中每一个节点的值都必须大于等于(或小于等于)其子树中每个节点的值(也可以说是其左右节点的值)。 大顶堆 对于每个节点的值都大于等于子树中每个节点值的堆,我们叫作“大顶堆”。 小顶堆 对于每个节点的值都小于等于子树中每个节点值的堆,我们叫作“小顶堆”。...

qq_42006733的博客 5815

手把手教您解决 AdGuard Home DNS重写功能失效的问题

AdGuard Home 设置了 DNS 重写,规则明明没问题,客户端却死活解析不到内网 IP?🤯 别急着重装!🚫 本文手把手教你如何解决软路由 DNS 解析“玄学”故障!🛠️🚀

XiaoqiangClub的博客 919

Python sort面试题目

Python中的排序是一个常见的面试主题,因为它不仅涉及基本的排序算法,还涉及到Python内置函数的使用和优化。以下是一些关于Python排序的面试题目:这些问题涵盖了Python排序的基本概念、内置函数的使用、算法复杂度的分析以及自定义排序函数的实现。它们有助于评估应聘者对Python排序功能的理解和应用能力。🌱 亲爱的读者,非常感谢你每一次的停留和阅读!你的支持是我们前行的最大动力!🙏🌐 在这茫茫网海中,有你的关注,我们深感荣幸。你的每一次点赞👍、收藏🌟、评论💬和关注💖,都像是明灯一样照

2401_84204207的博客 1202

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

堆排序的Python3实现

堆排序不仅是在面试很常见的考察题目,也是一种很重要的排序方法,通过堆排序,我们也能更好地了解堆这种数据结构的思想。 堆排序思想理论 堆排序涉及到的概念: 堆排序是利用 堆进行排序的 堆是一种完全二叉树 堆有两种类型: 大根堆 小根堆 两种类型的概念如下: 大根堆:每个结点的值都大于或等于左右孩子结点 小根堆:每个结点的值都小于或等于左右孩子结点 这里有一个自己常用的心得,对于树结构的描述,...

GQxxxxxl的博客 701

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

【面试】【排序】【堆排序】核心原理、大厂考点、三语言实现及优化策略

堆排序深度解析 堆排序基于完全二叉树结构,通过建堆(大/小顶堆)和交换堆顶元素实现排序。核心步骤包括自底向上建堆(O(n))和重复调整堆(O(n log n))。大厂面试常考建堆起点、Heapify实现及优化策略(如迭代代替递归)。典型应用包括Top K问题和合并有序链表。提供Python(递归)、Java(可选迭代)和C++(STL风格)三语言实现,强调手写代码要点和时空复杂度分析(O(n log n)时间,O(1)空间)。面试需掌握不稳定原因及与快排的对比。

学习代码 704

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Python堆排序介绍与力扣三道堆相关题目分享

堆的定义 堆 是一种特别的二叉树,满足以下条件的二叉树,可以称之为 堆: 完全二叉树; 每一个节点的值都必须 大于等于或者小于等于 其孩子节点的值。 堆 具有以下的特点: 可以在 O(logN)O(logN) 的时间复杂度内向 堆 中插入元素; 可以在 O(logN)O(logN) 的时间复杂度内向 堆 中删除元素; 可以在 O(1)O(1) 的时间复杂度内获取 堆 中的最大值或最小值。 堆的...

清风Python 638

堆排序算法详解:原理与Python实现

堆排序是一种高效的比较排序算法,通过利用堆数据结构的特性,能够在O(n log n)的时间内完成排序。理解堆排序的基本思想和实现步骤,对于深入学习排序算法和数据结构具有重要意义。

专注于全栈开发领域 1062

堆排序,python

转载自:https://www.jianshu.com/p/d174f1862601 堆排序的Python实现(附详细过程图和讲解) 正文前的扯淡 之前电话面试一个公司时,面试官让写一个堆排序,遗憾的是我忘了堆排序的思想了,所以直接说不会写,这次电面也以失败告终...知耻后勇,这几天在网上找了很多写堆排序的帖子,但是帖子质量不好,堆排序是什么不介绍,代码也非常不详细,看了半天没整明白,不过好...

qinglv1的博客 247

堆排序python实现

因为部门频繁调整,半年多时间直接上级换了三个,之前一起工作的同事被调离的时候大头没有放我过去,说还有业务让我支撑,在这次调整大头也被调走了,现在小团队的业务已经不再重要,人也都是一些老弱病残,并且技术路线也与部门大团队完全不同,因此,最近想换一个公司或者部门来寻找更好的发展。当我前几天到公司另一个部门面试了以后,才意识到对于一个刚刚工作1年多的人,在将近1年的业务紧密相关的开发下,算法已经忘干净了

zhao67865的专栏 611

排序算法之堆排序及Python实现

面试中经常会被问到排序算法,其中快速排序、归并排序、堆排序最有可能会被问到,它们的相似的地方在于算法复杂度均为O(nlogn),其中快排和归并排序前面已经介绍过,今天我们来学习一下堆排序。 堆排序基本概念 堆排序是利用堆进行排序的,堆是一种完全二叉树。完全二叉树是一种除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐的树。 堆有两种类型: 大根堆小根堆 两种类型的概念如下: 大根...

Jeremy_lf的博客 367

排序算法——堆排序Python实现

# -*- coding: utf-8 -*- """ @File : heap_sort.py @Author: Zhang_San @Time : 2020/7/20 17:51 @des : 堆排序:基于大根堆或者小根堆的一种排序,每次通过大/小根堆得特点,找出堆顶的元素,并跟当前子堆的最后一个元素交换,排除最后一个元素后, 新的子树重新形成堆,依次交换堆顶和最后当前堆的最后一个叶子元素,直到排序完成。 实现过程: (1)根据.

u011412768的博客 291

堆排序的Python实现(附详细过程图和讲解)

转自:https://www.jianshu.com/p/d174f1862601 正文前的扯淡 之前电话面试一个公司时,面试官让写一个堆排序,遗憾的是我忘了堆排序的思想了,所以直接说不会写,这次电面也以失败告终...知耻后勇,这几天在网上找了很多写堆排序的帖子,但是帖子质量不好,堆排序是什么不介绍,代码也非常不详细,看了半天没整明白,不过好在今天找出了数据结构课的课本,系统复习后,尝试用Py...

Candy_GL的博客 802

三分钟玩转堆排序原理及面试题(多图解释 Python实现)

堆基本概念 堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多实践中的算法会用到它,比如经典的TopK算法、小顶堆用于实现优先级队列。 堆排序是利用堆这种数据结构所设计的一种排序算法。堆实际上是一个完全二叉树结构。问:那么什么是完全二叉树呢?答:假设一个二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大...

码农富哥 1353

python实现堆排序用类的方法_三分钟玩转堆排序原理及面试题(多图解释+Python实现)...

堆基本概念堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多实践中的算法会用到它,比如经典的TopK算法、小顶堆用于实现优先级队列。堆排序是利用堆这种数据结构所设计的一种排序算法。堆实际上是一个完全二叉树结构。问:那么什么是完全二叉树呢?答:假设一个二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数...

weixin_39790510的博客 102

堆排序python代码实现_Python实现堆排序及原理详解 + TopK面试题(多图解释)

堆基本概念堆排序是一个很重要的排序算法,它是高效率的排序算法,复杂度是O(nlogn),堆排序不仅是面试进场考的重点,而且在很多实践中的算法会用到它,比如经典的TopK算法、小顶堆用于实现优先级队列。堆排序是利用堆这种数据结构所设计的一种排序算法。堆实际上是一个完全二叉树结构。问:那么什么是完全二叉树呢?答:假设一个二叉树的深度为h,除第 h 层外,其它各层 (1~h-1) 的结点数都达到最大个数...

weixin_39983350的博客 416
上一篇: 常见的面试问题————深度学习篇(持续更新)
下一篇: 面试算法和数据结构中那些和 “K” 相关的题目
烟雨人长安
博客等级 码龄10年 871粉丝 53原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值