ThinkChat🤖让你学习和工作更高效,注册即送10W Token,即刻开启你的AI之旅 广告
**堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大顶堆;或者每个结点的值都小于或等于其左右孩子结点的值,称为小顶堆** ![](https://img.kancloud.cn/09/c8/09c8e1650271f1dbf9967ee5008f358e_666x273.png) 最大堆 ![](https://img.kancloud.cn/51/fd/51fd23359a0a78510fc125f4c93a85bb_440x65.png) **大顶堆:arr\[i\] >= arr\[2i+1\] && arr\[i\] >= arr\[2i+2\]  ** **小顶堆:arr\[i\] <= arr\[2i+1\] && arr\[i\] <= arr\[2i+2\]  ** ``` let len function buildMaxHeap(arr) { //建立大根堆 len = arr.length for (let i = Math.floor(len / 2); i >= 0; i--) { heapify(arr, i) } } function heapify(arr, i) { //堆调整 let 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) { // 解构赋值,交换变量 ;[arr[i], arr[largest]] = [arr[largest], arr[i]] heapify(arr, largest) } } function heapSort(arr) { buildMaxHeap(arr) for (let i = arr.length - 1; i > 0; i--) { ;[arr[0], arr[i]] = [arr[i], arr[0]] len-- heapify(arr, 0) } return arr } console.log(heapSort([7, 3, 4, 5, 10, 7, 8, 2])) ```