高需求技能
Toptal客户
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个初始条件.
算法
# 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))
- 不太适应