//不稳定,与初始状态无关,平均时间复杂度O(nlogn)
var arr = [1,4,2,6,7,3];
//堆排序
// 堆分为大根堆和小根堆
// 大根堆表示根元素的值比其左右子节点的值都大(一般用于从小到大排序)
// 小根堆表示根元素的值比其左右子节点的值都小(一般 用于从大到小排序)
function heapSort(arr){
var len = arr.length;
arr = buildHeap(arr);
while(len>1){
len--;
swap(arr,0,len);
heapify(arr,len,0);
}
return arr;
}
//初始化一个堆
function buildHeap(arr){
var len = arr.length;
for(var i=Math.floor(len/2);i>=0;i--){
heapify(arr,len-1,i);
}
return arr;
}
function heapify(arr,len,i){
var left = i*2+1,
right = i*2+2;
largest = i;
if(left<len && arr[left]>arr[largest]){
largest = left;
}
if(right<len && arr[right]>arr[largest]){
largest = right;
}
if(largest!=i){
swap(arr,i,largest);
heapify(arr,len,largest);
}
}
function swap(arr,i,j){
var temp = arr[i];
arr[i] = arr[j];
arr[j] = temp;
}
console.log(heapSort(arr));