javascript堆排序算法的详细解决方案
1。堆桩。
堆本质上是一个完整的二叉树。它必须满足:树中非叶节点的任何键不大于或小于其左右两个孩子的关键字。
该堆分为:根堆和根堆堆、堆排序升序根、小堆堆序。
如果它是一个大的根堆,则通过调整函数将具有最大值的节点调整到堆根。
2、将堆保存在尾部,并将调整函数调用到剩余的序列中。调整完成后,最大鞋跟被保存在尾部- 1(- 1,- 2,…- I),然后剩余的序列被调整,并且过程被重复直到排序完成。
复制代码代码如下所示:
调整函数
功能headadjust(元素、POS,Len){
将保存当前节点的值。
var =元素};
位置到当前节点左子节点
var * = 2 + 1;
递归地,直到没有节点为止
当(子图){
如果当前节点有正确的子节点,以及大型场合的右子节点,则右子节点
与当前节点
如果(子+ 1 <元素} {子} <元素{子+ 1 }){
子=1;
}
当前节点和最大节点的比较小于交换、交换后当前节点位置的值。
在子节点中
如果(元素{ } } <元素{子}){
元素{ } } =元素{子};
儿童=;
子= 2 + 1;
}
别的{
打破;
}
元素{ } =交换;
}
}
施工桩
功能buildheap(元素){
节点从上一次启动带有子节点,比较节点及其子节点,
与节点交换的最大数目,经过交换,然后依次转发同一个节点进行交换处理,
直到构建了一个大的(升到堆顶,降到小顶部)
对于(var i =元素.长度 2;i = 0;i -){
headadjust(元素,我的元素。长度);
}
}
函数排序(元素){
施工桩
buildheap(元素);
从尾/序列调整开始
对于(var i = elements.length-1;我> 0;我--){
栈顶始终是最大的元素,因此,将是堆的顶部,尾部元素将交换。
存储在尾部的最大元素,不参与后面的调整。
var =元素{ };
元素{元素} { 0 };
元素{ 0 } =交换;
/调整最大调整到堆栈元素的顶部)
headadjust(元素、0、我);
}
}
var元素= { 3, 1, 5、7, 2, 4、9, 6, 10、8 };
console.log(在:+元素);
排序(元素);
console.log(':' +元素);
效率:
时间复杂度:最好的:O(Nlog2N),最差的:O(Nlog2N),平均O(Nlog2N)。
空间复杂度:o(1)。
稳定性:不稳定