堆排序
堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆。如下图:
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);
}
}