堆排序(大根堆)
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
排序算法 文章被收录于专栏
排序算法