第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

第 27 題:如何理解堆排序?

標(biāo)簽:
Html5 CSS3 面試

什么是堆排序?

是指利用堆这种数据结构所设计的一种排序算法。堆积是一个近似完全二叉树的结构,并同时满足堆积的性质:即子结点的键值或索引总是小于(或者大于)它的父节点

在看本文之前请先了解以下概念

完全二叉树:除了最后一层之外的其他每一层都被完全填充,每一层从左到右的填充数据,不能空缺(只是类似这个结构,所以本文不会用到这个知识点)

堆:分为大顶堆和小顶堆两种

大顶堆(小顶堆):可分为有序区和无序区,初始全部为无序区

执行的步骤是如何进行的?

  1. 无非就是将一个无序数组转化为大顶堆(小顶堆)

  2. 将堆顶的值和无序数组末尾值交换位置

  3. 根据堆的性质进行调整,成为大顶堆(小顶堆)

  4. 然后又继续 1~3 的步骤,反反复复直到无序区没有值为止

这个时候肯定会有人问,怎么区别有序区和无序区?什么是大顶堆(小顶堆)?以及大顶堆(小顶堆)是如何调整出来的?

如何辨别有序区和无序区?

1.png

2.png

循环结束后应该是这样的,没有无序区了

3.png

上面的大顶堆(小顶堆)实际在存储在数组中是这样的

现在应该知道有序区和无序区如何分辨了吧,以及大顶堆是如何在数组中进行存储的

什么是大顶堆(小顶堆)?

4.png

通过上图应该都能看出来大顶堆和小顶堆的区别了吧。

大顶堆:每个结点的值都大于或等于其左右孩子结点的值(大到小排列)

小顶堆:每个结点的值都小于或等于其左右孩子结点的值(小到大排列)

大顶堆(小顶堆)是如何调整出来的?

也是本文中最难理解的地方,下面简单描述一下主要的步骤:

目标:将无序数组(R1,R2…Rn)构建成大顶堆,即完成任务

  1. 初始时,此堆的所有值都是属于无序区

  2. 将堆顶元素 R[1]与无序区中最后一个元素 R[n]交换,此时得到新的无序区(R1,R2,…Rn-1)和新的有序区(Rn)

  3. 由于交换后新的堆顶 R[1]可能违反堆的性质,因此需要对当前无序区(R1,R2,…Rn-1)调整为新堆

  4. 然后再次将 R[1]与无序区最后一个元素交换,得到新的无序区(R1,R2…Rn-2)和新的有序区(Rn-1,Rn)。不断重复此过程直到无序区的元素个数 0,则整个排序过程完成

总结

  1. 其实主要的操作就是构造初始堆和调整堆。

  2. 每次调整都是从父节点(i - 1)/ 2、左孩子节点(2 _ i + 1)、右孩子节点(2 _ i + 2)三者中选择最大者跟父节点进行交换位置

5.gif

堆排序过程

點(diǎn)擊查看更多內(nèi)容
TA 點(diǎn)贊

若覺(jué)得本文不錯(cuò),就分享一下吧!

評(píng)論

作者其他優(yōu)質(zhì)文章

正在加載中
  • 推薦
  • 評(píng)論
  • 收藏
  • 共同學(xué)習(xí),寫(xiě)下你的評(píng)論
感謝您的支持,我會(huì)繼續(xù)努力的~
掃碼打賞,你說(shuō)多少就多少
贊賞金額會(huì)直接到老師賬戶
支付方式
打開(kāi)微信掃一掃,即可進(jìn)行掃碼打賞哦
今天注冊(cè)有機(jī)會(huì)得

100積分直接送

付費(fèi)專(zhuān)欄免費(fèi)學(xué)

大額優(yōu)惠券免費(fèi)領(lǐng)

立即參與 放棄機(jī)會(huì)
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)

舉報(bào)

0/150
提交
取消