码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 十大排序——4.堆排序


    前面我们讲了堆,现在我们来看一下队排序。

    堆排序的步骤:

    • 首先将一个无序数组建立成一个大顶堆
    • 然后,将堆顶的元素和堆低的元素进行交换(即将最大的元素交换的到堆底),缩小并下潜调整堆
    • 重复上一步,直到堆中只剩一个元素为止

    下面来看一下代码实现:

    下面看一下具体的代码:

    1. package Sorts;
    2. //堆排
    3. public class HeapSort {
    4. public static void main(String[] args) {
    5. int[] arr = {16, 7, 3, 20, 17, 8};
    6. heapSort(arr);
    7. for (int i : arr) {
    8. System.out.print(i + " ");
    9. }
    10. }
    11. /**
    12. * 创建堆
    13. */
    14. private static void heapSort(int[] arr) {
    15. //创建堆
    16. for (int i = (arr.length - 1) / 2; i >= 0; i--) {
    17. //从第一个非叶子结点从下至上,从右至左调整结构
    18. adjustHeap(arr, i, arr.length);
    19. }
    20. //调整堆结构+交换堆顶元素与末尾元素
    21. for (int i = arr.length - 1; i > 0; i--) {
    22. //将堆顶元素与末尾元素进行交换
    23. int temp = arr[i];
    24. arr[i] = arr[0];
    25. arr[0] = temp;
    26. //重新对堆进行调整
    27. adjustHeap(arr, 0, i);
    28. }
    29. }
    30. /**
    31. * 调整堆
    32. * @param arr 待排序列
    33. * @param parent 父节点
    34. * @param length 待排序列尾元素索引
    35. */
    36. private static void adjustHeap(int[] arr, int parent, int length) {
    37. //将temp作为父节点
    38. int temp = arr[parent];
    39. //左孩子
    40. int lChild = 2 * parent + 1;
    41. while (lChild < length) {
    42. //右孩子
    43. int rChild = lChild + 1;
    44. // 如果有右孩子结点,并且右孩子结点的值大于左孩子结点,则选取右孩子结点
    45. if (rChild < length && arr[lChild] < arr[rChild]) {
    46. lChild++;
    47. }
    48. // 如果父结点的值已经大于孩子结点的值,则直接结束
    49. if (temp >= arr[lChild]) {
    50. break;
    51. }
    52. // 把孩子结点的值赋给父结点
    53. arr[parent] = arr[lChild];
    54. //选取孩子结点的左孩子结点,继续向下筛选
    55. parent = lChild;
    56. lChild = 2 * lChild + 1;
    57. }
    58. arr[parent] = temp;
    59. }
    60. }

    堆排序主要就是运用了堆的特性,对于堆,堆元素的下潜操作一顶要熟悉。

  • 相关阅读:
    【Unity编辑器扩展】| GameView面板扩展
    Vue-04-axios异步通信
    超参数优化(网格搜索和贝叶斯优化)
    Java项目:JSP中华传统美食网站平台管理系统
    代码随想录算法训练营DAY37|C++贪心算法Part.6|738.单调递增的数字、968.监控二叉树、贪心算法总结
    陕西秦创原创新驱动平台案例解读
    基于springboot+vue开发的教师工作量管理系
    git branch -r 远程分支显示不全
    猿创征文|我毕业了一个月,却给了我过了一年的感觉
    数字孪生软件模型关键点:模型导入+编辑
  • 原文地址:https://blog.csdn.net/m0_52096593/article/details/133184379
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号