堆排序是指利用堆这种数据结构所设计的一种排序算法。近似于完全二叉树,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点。它的时间复杂度是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(left<length&&arr[left]>arr[largest]){
15 largest = left;
16 }
17 if(right<length&&arr[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]));