高需求技能
Toptal客户
反应.js开发人员职位节点.js开发人员职位Ruby on Rails开发人员职位Azure开发人员职位反应 Native开发者职位QA工程师职位去做工程师JavaScript开发人员职位Python开发人员职位Django开发人员职位PHP开发人员职位c#开发人员职位iOS开发者职位区块链开发人员职位Swift开发人员工作AWS开发人员职位Vue.js开发人员职位Java开发人员职位.NET开发人员职位Angular开发者职位Android开发者职位Magento开发人员职位Shopify开发人员职位Word新闻开发人员职位Laravel开发者职位长生不老药开发工作Docker开发人员职位Flutter开发者职位软件架构师职位Unity或Unity3D开发人员工作云工程师职位ASP.NET开发人员职位Kubernetes专家工作系统安全开发人员职位Kotlin开发者工作CSS开发人员职位计算机视觉开发人员职位人工智能工程师职位Drupal开发人员职位SQL开发人员职位Symfony开发者职位Ruby开发人员职位数据科学家的工作商业智能开发人员职位c++开发人员职位Ionic开发者工作GraphQL开发人员职位机器学习工程师职位Xamarin开发者职位Firebase开发人员职位反应.js开发人员职位节点.js开发人员职位Ruby on Rails开发人员职位Azure开发人员职位反应 Native开发者职位QA工程师职位去做工程师JavaScript开发人员职位Python开发人员职位Django开发人员职位PHP开发人员职位c#开发人员职位iOS开发者职位区块链开发人员职位Swift开发人员工作AWS开发人员职位Vue.js开发人员职位Java开发人员职位.NET开发人员职位Angular开发者职位Android开发者职位Magento开发人员职位Shopify开发人员职位Word新闻开发人员职位Laravel开发者职位长生不老药开发工作Docker开发人员职位Flutter开发者职位软件架构师职位Unity或Unity3D开发人员工作云工程师职位ASP.NET开发人员职位Kubernetes专家工作系统安全开发人员职位Kotlin开发者工作CSS开发人员职位计算机视觉开发人员职位人工智能工程师职位Drupal开发人员职位SQL开发人员职位Symfony开发者职位Ruby开发人员职位数据科学家的工作商业智能开发人员职位c++开发人员职位Ionic开发者工作GraphQL开发人员职位机器学习工程师职位Xamarin开发者职位Firebase开发人员职位

Toptal连接了前3%的 自由开发人员 世界各地.

堆排序

动画,代码,分析,并讨论堆排序在4个初始条件.

使用方法: 新闻 “玩”,或选择  玩  button.

所有玩
播放动画
随机
播放动画
近排序
播放动画
逆转
播放动画
一些独特的

算法

# heapify
对于I = n/2:1, sink(a, I,n)
→不变式:a[1,n]按堆顺序排列

# sortdown
对于I = 1:n,
    交换(1,n + 1)
    水槽(1,n)
    →不变式:a[n-i+1,n]在最终位置
结束

# sink from a[1..n]
函数水槽(我,n):
    # {lc,rc,mc} ={左,右,max}子索引
    Lc = 2*i
    if lc > n, return # no children
    Rc = lc + 1
    mc = (rc > n) ? lc : (a[lc] > a[rc]) ? 立法会:rc
    if a[i] >= a[mc], return # heap ordered
    交换(我,mc)
    水槽(mc, n)

讨论

堆排序很容易实现,执行O(n·lg(n))的就地排序,但不稳定.

第一个循环,Θ(n)“heapify”阶段,将数组按堆顺序排列. 第二个循环, O(n·lg(n))“排序”阶段, 重复提取最大值并恢复堆顺序.

为了清晰起见,接收函数是递归地编写的. 因此,如所示,代码需要Θ(lg(n))空间作为递归调用堆栈. 然而, sink()中的尾部递归很容易转换为迭代, 得到O(1)空间界.

这两个阶段都有轻微的适应性,尽管没有任何特别有用的方式. 在接近排序的情况下,heapify阶段破坏了原始顺序. 相反的情况, heapify阶段尽可能快,因为数组是按堆顺序启动的, 然后是典型的排序阶段. 在少数唯一键的情况下, 有一些加速,但没有shell排序或3-way快速排序那么快.

关键

  • 黑色值排序.
  • 灰度值未排序.
  • 红色三角形标记算法位置.

属性

  • 不稳定
  • O(1)额外空间(见讨论)
  • O (n·格林(n))
  • 不太适应

准备技术面试? 看看我们的采访指南吧.