全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

java 数据结构之堆排序(HeapSort)详解及实例

1 堆排序

堆是一种重要的数据结构,分为大根堆和小根堆,是完全二叉树, 底层如果用数组存储数据的话,假设某个元素为序号为i(Java数组从0开始,i为0到n-1),如果它有左子树,那么左子树的位置是2i+1,如果有右子树,右子树的位置是2i+2,如果有父节点,父节点的位置是(n-1)/2取整。最大堆的任意子树根节点不小于任意子结点,最小堆的根节点不大于任意子结点。

所谓堆排序就是利用堆这种数据结构的性质来对数组进行排序,在数组的非降序排序中,需要使用的就是大根堆,因为根据大根堆的性质可知,最大的值一定在堆顶。堆排序一种不稳定的排序算法,其时间复杂度为O(nlogn)。

2 算法思想

(1)构建最大堆;
(2)选择顶,并与第0位置元素交换;
(3)由于步骤(2)的的交换可能破环了最大堆的性质,即第0位置的元素不再是最大元素,则需要调用maxHeap调整堆(沉降法),根据实际情况重复步骤(2)。

堆排序中最重要的算法就是maxHeap,该函数假设一个元素的两个子节点都满足最大堆的性质(即左、右子树都是最大堆),只有根元素可能违反最大堆性质,那么把该元素以及左右子节点的最大元素找出来,如果该元素已经最大,那么整棵树都是最大堆,程序退出,否则交换根元素与最大元素的位置,继续调用maxHeap构建最大元素所在的子树。

3 Java代码

public class HeapSort {
  public static void main(String[] args) {
    int[] arr = {3, 2, 1, 0, -1, -2, -3};
    System.out.println("Before heap:");
    printArray(arr);
    heapSort(arr);
    System.out.println("After heap sort:");
    printArray(arr);
  }

  public static void heapSort(int[] arr) {
    if (arr == null || arr.length <= 1) {
      return;
    }
    buildMaxHeap(arr); //构建最大堆
    for (int i = arr.length - 1; i >= 1; i--) {
      exchangeElements(arr, 0, i); //交换堆顶和第0位置元素
      maxHeap(arr, i, 0); //因为交换元素后,有可能违反堆的性质,所以沉降元素
    }
  }

  private static void buildMaxHeap(int[] arr) { //构建最大堆
    if (arr == null || arr.length <= 1) {
      return;
    }
    int half = arr.length / 2;
    for (int i = half; i >= 0; i--) {
      maxHeap(arr, arr.length, i);
    }
  }

  private static void maxHeap(int[] arr, int heapSize, int index) {
    int left = index * 2 + 1; //左子树上的元素
    int right = index * 2 + 2; //右子树上的元素
    int largest = index; //初始化最大元素
    if (left < heapSize && arr[left] > arr[index]) {
      largest = left;
    }
    if (right < heapSize && arr[right] > arr[largest]) {
      largest = right;
    }
    if (index != largest) { //判断根元素是否为最大元素
      exchangeElements(arr, index, largest);
      maxHeap(arr, heapSize, largest);
    }
  }

  public static void printArray(int[] arr) { //打印数组
    System.out.print("{");
    for (int i = 0; i < arr.length; i++) {
      System.out.print(arr[i]);
      if (i < arr.length - 1) {
        System.out.print(", ");
      }
    }
    System.out.println("}");
  }

  public static void exchangeElements(int[] arr, int index1, int index2) { //交换元素
    int temp = arr[index1];
    arr[index1] = arr[index2];
    arr[index2] = temp;
  }
}



感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!


# 堆排序(HeapSort)  # java  # 堆排序  # HeapSort  # Java数据结构之优先级队列(堆)图文详解  # Java 数据结构与算法系列精讲之二叉堆  # Java深入了解数据结构之优先级队列(堆)  # 深入了解Java数据结构和算法之堆  # Java数据结构中堆的向下和向上调整解析  # Java 数据结构之堆的概念与应用  # java数据结构-堆实现优先队列  # Java 超详细讲解数据结构中的堆的应用  # 子树  # 大堆  # 都是  # 数据结构  # 树上  # 是一种  # 有可能  # 最重要  # 希望能  # 实际情况  # 谢谢大家  # 不稳定  # 并与  # 为大  # 棵树  # 则需  # 把该  # 降序  # 二叉树  # 不小于 


相关文章: 如何制作一个表白网站视频,关于勇敢表白的小标题?  想学网站制作怎么学,建立一个网站要花费多少?  如何确保西部建站助手FTP传输的安全性?  动图在线制作网站有哪些,滑动动图图集怎么做?  小型网站制作HTML,*游戏网站怎么搭建?  如何选择PHP开源工具快速搭建网站?  如何在万网自助建站中设置域名及备案?  定制建站哪家更专业可靠?推荐榜单揭晓  如何快速建站并高效导出源代码?  外贸公司网站制作哪家好,maersk船公司官网?  Bpmn 2.0的XML文件怎么画流程图  洛阳网站制作公司有哪些,洛阳的招聘网站都有哪些?  ,网页ppt怎么弄成自己的ppt?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  微信小程序制作网站有哪些,微信小程序需要做网站吗?    建站主机助手选型指南:2025年热门推荐与高效部署技巧  长沙做网站要多少钱,长沙国安网络怎么样?  网站制作怎么样才能赚钱,用自己的电脑做服务器架设网站有什么利弊,能赚钱吗?  ,怎么在广州志愿者网站注册?  建站之星价格显示格式升级,你的预算足够吗?  网站制作员失业,怎样查看自己网站的注册者?  北京网站制作的公司有哪些,北京白云观官方网站?  建站之星如何快速生成多端适配网站?  如何通过多用户协作模板快速搭建高效企业网站?  海南网站制作公司有哪些,海口网是哪家的?  c++怎么实现高并发下的无锁队列_c++ std::atomic原子变量与CAS操作【详解】  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  韩国代理服务器如何选?解析IP设置技巧与跨境访问优化指南  广州营销型建站服务商推荐:技术优势与SEO优化解析  如何设置并定期更换建站之星安全管理员密码?  如何选择可靠的免备案建站服务器?  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  建站之星导航如何优化提升用户体验?  黑客如何通过漏洞一步步攻陷网站服务器?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  企业宣传片制作网站有哪些,传媒公司怎么找企业宣传片项目?  如何选择适合PHP云建站的开源框架?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  如何确保FTP站点访问权限与数据传输安全?  如何在Windows虚拟主机上快速搭建网站?  建站主机选哪种环境更利于SEO优化?  油猴 教程,油猴搜脚本为什么会网页无法显示?  定制建站如何定义?其核心优势是什么?  小程序网站制作需要准备什么资料,如何制作小程序?  北京建设网站制作公司,北京古代建筑博物馆预约官网?  如何选择长沙网站建站模板?H5响应式与品牌定制哪个更优?  贸易公司网站制作流程,出口贸易网站设计怎么做?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  行程制作网站有哪些,第三方机票电子行程单怎么开? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。