var arr = [49,38,27,97,76,13,65,50];
function MaxHeap(arr,size,i){
//左子节点
var left = i*2+1;
//右子节点
var right = i*2+2;
//假设这个根节点为最大
var max = i
//如果左子树的节点大于根节点则将max赋值
if(left<size && arr[left]>arr[max]){
max = left
}
//如果右子树的节点大于根节点则将max赋值
if(right<size && arr[right]>arr[max]){
max = right
}
//如果存在比根节点大的值
if(max !== i){
var temp = arr[max];
arr[max] = arr[i];
arr[i] = temp;
//调整后子节点可能不是最大堆,需要重新调整
MaxHeap(arr,size,max)
}
}
function HeapSort(arr) {
var len = arr.length
// 从最后一个根节点来调整堆
var lastIndex = Math.floor((len - 1 - 1) / 2); //寻找倒数第二行的根节点的索引
for(var i=lastIndex;i>=0;i--){
MaxHeap(arr,len,i)
}
return arr;
}
console.log(HeapSort(arr)); //97,76,65,50,49,13,27,38
堆排序(大根堆)
最新推荐文章于 2024-08-14 11:57:07 发布