堆排序
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:
function heapSort(arr) { for(var i=Math.floor(arr.length/2)-1;i>=0;i--){ //从上而下生成大顶堆 heapAdjust(arr,i,arr.length); } for(var j=arr.length-1;j>0;j--){ swap(arr,0,j); //交换顶推元素和末尾元素,使最大元素换到队尾 heapAdjust(arr,0,j); //重新调整堆 } return arr; } function heapAdjust(arr,i,len) { //自上而下 var temp=arr[i]; var largest=i; var left=2*i+1; var right=2*i+2; if(left<len && arr[left]>arr[largest]){ larget=left; } if(right<len && arr[right]>arr[largest]){ largest=right; } if(largest!=i){ swap(arr,larget,i); heapAdjust(arr,largest,len); } }