/* * æå¤§å * å çæ¬è´¨æ¯ä¸ç§æ å½¢ç»æ */ module.exports.maxHeap = class MaxHeap { constructor() { this.data = []; this.count = 0; } // åå§åå // ä¼ éä¸ä¸ªæ°ç»,éè¿heapifyå¿«éçæå init(arr) { if(arr instanceof Array) { this.data = arr; this.count = arr.length; this.heapify(arr); } } // éè¿å½æ°å¿«éçææå¤§å heapify(arr) { var count = arr.length; for(var i = Math.floor(count/2); i >= 0; i--) { this.shiftDown(i); } } // è¿åå ä¸çå ç´ ä¸ªæ° size() { return this.count; } // 夿å 䏿¯å¦ä¸ºç©º isEmpty() { return this.count === 0; } // æåå ç´ ,ä½æå ¥æ°å ç´ çæ¶åï¼å¤æè¯¥å ç´ æ¯ä¸æ¯æå¤§å¼ // ç´¢å¼ä»0å¼å§ï¼æä»¥iå ç´ çå·¦åå ç´ ä¸º2*i+1,å³åå ç´ ä¸º2*i+2,iå ç´ çç¶å ç´ ä¸º(i-1)/2 shiftUp(k) { while(k >= 0 && this.data[Math.floor((k-1)/2)] < this.data[k]) { // 妿åå ç´ å¤§äºç¶å ç´ ,交æ¢ä½ç½® this.swap(this.data, Math.floor((k-1)/2), k); k = Math.floor((k-1)/2); } } // åæå¤§å ä¸æå ¥ä¸ä¸ªæ°çå ç´ insert(element) { this.data.push(element); this.count = this.data.length; // å¤ææ°æå ¥çå ç´ æ¯ä¸æ¯æå¤§å¼ this.shiftUp(this.count-1); } // 仿大å ååºå ç´ åï¼éè¦éæ°è·å¾æå¤§å¼ï¼æ¾å°å çé¡¶é¨ shiftDown(k) { while(2*k+1 <= this.count-1) { // å·¦åå ç´ å¯¹åºçç´¢å¼ var j = 2 * k + 1; if(j+1 <= this.count-1 && this.data[j+1] > this.data[j]) { // 夿å½åå³åå ç´ æ¯å¦åå¨ï¼å¼æ¯å¦å¤§äºåå·¦å ç´ j++; } // 妿ç¶å ç´ å¤§äºåå ç´ ï¼åä¸ç¨äº¤æ¢ï¼ä¿æåæ¥ä½ç½® if(this.data[k] >= this.data[j]) break; this.swap(this.data, k, j); k = j; } } // ä¼åshiftDown,使ç¨èµå¼çæ¹å¼å代䏿çswap // ä¼åæè·¯åé´æå ¥æåºçä¼åæè·¯ shiftDownII(k) { // å ä¿ækç´¢å¼å¯¹åºçå¼ var t = this.data[k]; while(2*k+1 <= this.count-1) { var j = 2 * k + 1; if(j+1 <= this.count-1 && this.data[j+1] > this.data[j]) { j++; } if(t > this.data[j]) break; arr[k] = arr[j]; k = j; } // æååèµå¼ this.data[k] = e; } // 仿大å ä¸ååºå é¡¶å ç´ ï¼å³å 䏿åå¨çæå¤§æ°æ® extractMax() { if(this.count <=0) return; var ret = this.data[0]; this.swap(this.data, 0, this.count-1); this.count--; // æ´æ°å é¡¶ this.shiftDown(0); return ret; } // è·åå çæå¤§å¼ getMax() { return this.data[0]; } // äº¤æ¢æ°æ® swap(arr, a, b) { var t = arr[a]; arr[a] = arr[b]; arr[b] = t; } } // å æåº1 // æ¶é´å¤æåº¦O(nlogn) module.exports.heapSort1 = function heapSort1(arr) { var maxHeap = new exports.maxHeap(); for(var i = 0; i < arr.length; i++) { maxHeap.insert(arr[i]); } for(var i = arr.length-1; i >= 0; i--) { arr[i] = maxHeap.extractMax(); } } // å æåº2 // åå©heapifyè¿ç¨å建å // æ¤æ¶å建å çè¿ç¨æ¶é´å¤æåº¦ä¸ºO(n),å°ææå ç´ ä¾æ¬¡ä»å ä¸ååºæ¥ï¼æ¶é´å¤æåº¦ä¸ºO(nlogn) // æ»ä½æ¶é´å¤æåº¦ä»ä¸ºO(nlogn)ï¼ä½ä¼åäºå建å çæ¶é´ module.exports.heapSort2 = function heapSort2(arr) { var maxHeap = new exports.maxHeap(); maxHeap.init(arr); for(var i = arr.length-1; i >= 0; i--) { arr[i] = maxHeap.extractMax(); } }