全网整合营销服务商

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

免费咨询热线: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 超详细讲解数据结构中的堆的应用  # 子树  # 大堆  # 都是  # 数据结构  # 树上  # 是一种  # 有可能  # 最重要  # 希望能  # 实际情况  # 谢谢大家  # 不稳定  # 并与  # 为大  # 棵树  # 则需  # 把该  # 降序  # 二叉树  # 不小于 


相关文章: 建站之星24小时客服电话如何获取?  如何快速辨别茅台真假?关键步骤解析  北京网站制作费用多少,建立一个公司网站的费用.有哪些部分,分别要多少钱?  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  如何挑选最适合建站的高性能VPS主机?  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何规划企业建站流程的关键步骤?  如何通过西部数码建站助手快速创建专业网站?  ,购物网站怎么盈利呢?  表情包在线制作网站免费,表情包怎么弄?  小说建站VPS选用指南:性能对比、配置优化与建站方案解析  定制建站流程步骤详解:一站式方案设计与开发指南  *服务器网站为何频现安全漏洞?  建站主机如何安装配置?新手必看操作指南  如何快速查询域名建站关键信息?  购物网站制作公司有哪些,哪个购物网站比较好?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  上海网站制作开发公司,上海买房比较好的网站有哪些?  手机网站制作与建设方案,手机网站如何建设?  建站VPS选购需注意哪些关键参数?  网站制作话术技巧,网站推广做的好怎么话术?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  建站之星如何防范黑客攻击与数据泄露?  宁波免费建站如何选择可靠模板与平台?  建站主机空间推荐 高性价比配置与快速部署方案解析  韩国网站服务器搭建指南:VPS选购、域名解析与DNS配置推荐  建站ABC备案流程中有哪些关键注意事项?  如何在腾讯云服务器快速搭建个人网站?  高端云建站费用究竟需要多少预算?  北京企业网站设计制作公司,北京铁路集团官方网站?  完全自定义免费建站平台:主题模板在线生成一站式服务  如何用已有域名快速搭建网站?  山东网站制作公司有哪些,山东大源集团官网?  视频网站制作教程,怎么样制作优酷网的小视频?  c++ stringstream用法详解_c++字符串与数字转换利器  建站之星备案是否影响网站上线时间?  C++如何编写函数模板?(泛型编程入门)  b2c电商网站制作流程,b2c水平综合的电商平台?  高防服务器:AI智能防御DDoS攻击与数据安全保障  建站之星客服服务时间及联系方式如何?  长沙企业网站制作哪家好,长沙水业集团官方网站?  如何撰写建站申请书?关键要点有哪些?  太平洋网站制作公司,网络用语太平洋是什么意思?  建站主机与虚拟主机有何区别?如何选择最优方案?  平台云上自主建站:模板化设计与智能工具打造高效网站  如何用美橙互联一键搭建多站合一网站?  如何通过FTP服务器快速搭建网站?  如何快速搭建高效香港服务器网站?  胶州企业网站制作公司,青岛石头网络科技有限公司怎么样?  如何快速搭建响应式可视化网站? 

您的项目需求

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