堆排序

排序算法中的第7个

堆排序

堆排序是指利用“堆”这个数据结构进行排序 而堆是一个近似完全二叉树的结构

排序思路

  1. 构建一个堆(大顶堆或小顶堆)
  2. 把堆首(最大值)和堆尾元素互换
  3. 把堆的尺寸缩小1,并重新构建新的堆,目的是把新的数组顶端数据调整到相应的位置
  4. 重复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;
}
posted @   Cloong  阅读(35)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
点击右上角即可分享
微信分享提示