堆排序的时间复杂度为:nlogn
且较稳定即使是在最坏或最好的情况下,其时间效率都是nlogn
因为js不存在内置的堆排序函数或方法,所以只能自己实现
function bigHeap(arr,len){
for(let i=Math.floor(len/2)-1;i>=0;i--){ //依次查找非叶子节点,以其作为根进行堆排序的初始化
heap(arr,len,i);
}
for(let j=len-1;j>0;j--){
swap(arr,0,j); //依次将堆顶的最大值取出,放置在数组的最后
heap(arr,j,0); //除去堆顶的元素,重新构建堆
}
}
function heap(nums,len,i){ //堆排序核心
let first=i; //记录根节点的位置
let l=i*2+1; //找出根节点的左子节点
let r=i*2+2; //找出根节点的右子节点
if(l<len&&nums[l]>nums[first]){ //下列两个if是为了找到根节点与子节点最大值对应的下标
first=l;
}
if(r<len&&nums[r]>nums[first]){
first=r
}
if(first!=i){ //验证初始的根节点是否为最大值
swap(nums,first,i); //根节点与最大子节点交换
heap(nums,len,first) //交换后,重新构建交换的子节点以下的堆
}
}
function swap(nums,i,j){ //交换数组中两个元素值
let temp=nums[i];
nums[i]=nums[j];
nums[j]=temp;
}