手写堆排序

317 阅读1分钟

堆排序的时间复杂度为: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;
     }