# å æåº å æåºï¼Heapsortï¼æ¯æå©ç¨å è¿ç§æ°æ®ç»ææè®¾è®¡çä¸ç§æåºç®æ³ãå 积æ¯ä¸ä¸ªè¿ä¼¼å®å ¨äºåæ çç»æï¼å¹¶åæ¶æ»¡è¶³å ç§¯çæ§è´¨ï¼å³åç»ç¹çé®å¼æç´¢å¼æ»æ¯å°äºï¼æè 大äºï¼å®çç¶èç¹ãå æåºå¯ä»¥è¯´æ¯ä¸ç§å©ç¨å çæ¦å¿µæ¥æåºçéæ©æåºãåä¸ºä¸¤ç§æ¹æ³ï¼ 1. 大顶å ï¼æ¯ä¸ªèç¹çå¼é½å¤§äºæçäºå ¶åèç¹çå¼ï¼å¨å æåºç®æ³ä¸ç¨äºååºæåï¼ 2. å°é¡¶å ï¼æ¯ä¸ªèç¹çå¼é½å°äºæçäºå ¶åèç¹çå¼ï¼å¨å æåºç®æ³ä¸ç¨äºéåºæåï¼ å æåºç平忶é´å¤æåº¦ä¸º Î(nlogn)ã ## 1. ç®æ³æ¥éª¤ 1. å建ä¸ä¸ªå H[0â¦â¦n-1]ï¼ 2. æå é¦ï¼æå¤§å¼ï¼åå å°¾äºæ¢ï¼ 3. æå çå°ºå¯¸ç¼©å° 1ï¼å¹¶è°ç¨ shift_down(0)ï¼ç®çæ¯ææ°çæ°ç»é¡¶ç«¯æ°æ®è°æ´å°ç¸åºä½ç½®ï¼ 4. é夿¥éª¤ 2ï¼ç´å°å ç尺寸为 1ã ## 2. å¨å¾æ¼ç¤º  ## 3. JavaScript 代ç å®ç° ```js var len; // å 为声æçå¤ä¸ªå½æ°é½éè¦æ°æ®é¿åº¦ï¼æä»¥ælen设置æä¸ºå ¨å±åé function buildMaxHeap(arr) { // 建ç«å¤§é¡¶å len = arr.length; for (var i = Math.floor(len/2); i >= 0; i--) { heapify(arr, i); } } function heapify(arr, i) { // å è°æ´ var left = 2 * i + 1, right = 2 * i + 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, largest); } } function swap(arr, i, j) { var temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } function heapSort(arr) { buildMaxHeap(arr); for (var i = arr.length-1; i > 0; i--) { swap(arr, 0, i); len--; heapify(arr, 0); } return arr; } ``` ## 4. Python 代ç å®ç° ```python def buildMaxHeap(arr): import math for i in range(math.floor(len(arr)/2),-1,-1): heapify(arr,i) def heapify(arr, i): left = 2*i+1 right = 2*i+2 largest = i if left < arrLen and arr[left] > arr[largest]: largest = left if right < arrLen and arr[right] > arr[largest]: largest = right if largest != i: swap(arr, i, largest) heapify(arr, largest) def swap(arr, i, j): arr[i], arr[j] = arr[j], arr[i] def heapSort(arr): global arrLen arrLen = len(arr) buildMaxHeap(arr) for i in range(len(arr)-1,0,-1): swap(arr,0,i) arrLen -=1 heapify(arr, 0)   return arr ``` ## 5. Go 代ç å®ç° ```go func heapSort(arr []int) []int { arrLen := len(arr) buildMaxHeap(arr, arrLen) for i := arrLen - 1; i >= 0; i-- { swap(arr, 0, i) arrLen -= 1 heapify(arr, 0, arrLen) } return arr } func buildMaxHeap(arr []int, arrLen int) { for i := arrLen / 2; i >= 0; i-- { heapify(arr, i, arrLen) } } func heapify(arr []int, i, arrLen int) { left := 2*i + 1 right := 2*i + 2 largest := i if left < arrLen && arr[left] > arr[largest] { largest = left } if right < arrLen && arr[right] > arr[largest] { largest = right } if largest != i { swap(arr, i, largest) heapify(arr, largest, arrLen) } } func swap(arr []int, i, j int) { arr[i], arr[j] = arr[j], arr[i] } ``` ## 6. Java 代ç å®ç° ```java public class HeapSort implements IArraySort { @Override public int[] sort(int[] sourceArray) throws Exception { // 对 arr è¿è¡æ·è´ï¼ä¸æ¹ååæ°å 容 int[] arr = Arrays.copyOf(sourceArray, sourceArray.length); int len = arr.length; buildMaxHeap(arr, len); for (int i = len - 1; i > 0; i--) { swap(arr, 0, i); len--; heapify(arr, 0, len); } return arr; } private void buildMaxHeap(int[] arr, int len) { for (int i = (int) Math.floor(len / 2); i >= 0; i--) { heapify(arr, i, len); } } private void heapify(int[] arr, int i, int len) { int left = 2 * i + 1; int right = 2 * i + 2; int 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, largest, len); } } private void swap(int[] arr, int i, int j) { int temp = arr[i]; arr[i] = arr[j]; arr[j] = temp; } } ``` ## 7. PHP 代ç å®ç° ```php function buildMaxHeap(&$arr) { global $len; for ($i = floor($len/2); $i >= 0; $i--) { heapify($arr, $i); } } function heapify(&$arr, $i) { global $len; $left = 2 * $i + 1; $right = 2 * $i + 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, $largest); } } function swap(&$arr, $i, $j) { $temp = $arr[$i]; $arr[$i] = $arr[$j]; $arr[$j] = $temp; } function heapSort($arr) { global $len; $len = count($arr); buildMaxHeap($arr); for ($i = count($arr) - 1; $i > 0; $i--) { swap($arr, 0, $i); $len--; heapify($arr, 0); } return $arr; } ```