堆排序是指利用堆这种数据结构所设计的一种排序算法。近似于完全二叉树,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。它的时间复杂度是O(nlog2(n)),空间复杂度是O(1),其算法不稳定。
1 var length;//因为声明的多个函数都需要数据长度,所以把len设置成为全局变量 2 //建立大顶堆 3 function buildMaxHead(arr) { 4 length = arr.length; 5 for (var i = parseInt(length/2); i>=0; i--) { 6 heapify(arr,i); 7 } 8 } 9 //堆调整10 function heapify(arr,i) {11 var left = 2*i+1;12 var right = 2*i+2;13 var largest = i;14 if(leftarr[largest]){15 largest = left;16 }17 if(right arr[largest]){18 largest = right;19 }20 if(largest!=i){21 swap(arr,i,largest);22 heapify(arr,largest);23 }24 }25 //交换两个数26 function swap(arr,i,j) {27 var temp = arr[i];28 arr[i] = arr[j];29 arr[j] = temp;30 }31 //堆排序32 function heapSort(arr) {33 buildMaxHead(arr);34 for ( var i = arr.length-1; i >0; i--) {35 //console.log(arr);36 swap(arr,0,i);37 length--;38 heapify(arr,0);39 }40 return arr;41 }42 console.log(heapSort([10,3,5,6,2,7,9,4,0,2,5]));