数据结构与算法【Java】08—树结构的实际应用


前言

数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码。

  • 要学习好数据结构就要多多考虑如何将生活中遇到的问题,用程序去实现解决.
  • 程序 = 数据结构 + 算法
  • 数据结构是算法的基础, 换言之,想要学好算法,需要把数据结构学到位

我会用数据结构与算法【Java】这一系列的博客记录自己的学习过程,如有遗留和错误欢迎大家提出,我会第一时间改正!!!

1、堆排序

1.1、堆排序简介

​ 1.堆排序是利用堆这种数据结构而设计的一种排序算法,堆排序是一种选择排序,它的最坏,最好,平均时间复杂度均为 O(nlogn),它是不稳定排序。

  1. 堆是具有以下性质的完全二叉树:每个结点的值都大于或等于其左右孩子结点的值,称为大根堆(或大顶堆), 注意 : 没有
    要求结点的左孩子的值和右孩子的值的大小关系。

  2. 每个结点的值都小于或等于其左右孩子结点的值,称为小根堆(或小顶堆)

  3. 一般升序采用大根堆,降序采用小根堆

1.2、堆排序过程演示

堆排序的基本思想是:

  1. 将待排序序列构造成一个大根堆
  2. 此时,整个序列的最大值就是堆顶的根节点。
  3. 将其与末尾元素进行交换,此时末尾就为最大值。
  4. 然后将剩余 n-1 个元素重新构造成一个堆,这样会得到 n 个元素的次小值。如此反复执行,便能得到一个有序
    序列了。

步骤图解

要求:给你一个数组 {4,6,8,5,9} , 要求使用堆排序法,将数组升序排序。

  • 步骤一 构造初始堆。将给定无序序列构造成一个大根堆(一般升序采用大根堆,降序采用小根堆)。
  • 原始的数组 [4, 6, 8, 5, 9]
  1. 假设给定无序序列结构如下

  2. 此时我们从最后一个非叶子结点开始(叶结点自然不用调整,第一个非叶子结点arr.length/2-1=5/2-1=1,也就是下面的 6 结点),从左至右,从下至上进行调整。

3.找到第二个非叶节点 4,由于[4,9,8]中 9 元素最大,4 和 9 交换。

4.这时,交换导致了子根[4,5,6]结构混乱,继续调整,[4,5,6]中 6 最大,交换 4 和 6。

此时,我们就将一个无序序列构造成了一个大顶堆.

  • 步骤二 将堆顶元素与末尾元素进行交换,使末尾元素最大。然后继续调整堆,再将堆顶元素与末尾元素交换得到第二大元素。如此反复进行交换、重建、交换

本站声明:
1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;

2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;

3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;

4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;

5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/tech/java/294487.html

(0)
上一篇 2022年12月3日 17:24
下一篇 2022年12月3日 18:21

相关推荐

发表回复

登录后才能评论