堆排序
排序算法中的第7个
堆排序
堆排序是指利用“堆”这个数据结构进行排序 而堆是一个近似完全二叉树的结构
排序思路
- 构建一个堆(大顶堆或小顶堆)
- 把堆首(最大值)和堆尾元素互换
- 把堆的尺寸缩小1,并重新构建新的堆,目的是把新的数组顶端数据调整到相应的位置
- 重复2,3步骤 直到堆的尺寸为1 排序结束
演示动画 引用B站up主@季末梧霜
实现代码
//堆排序 public int[] heapSort(int[] sourceArray) { // 对 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) { //math.floor 返回小于参数的最大整数 即向下取整 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; }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构