排序算法-堆排序

devtools/2024/10/21 3:58:07/

  一、二叉堆的特性:

1、最大堆的堆顶是整个堆中的最大元素。

2、最小堆的堆顶是整个堆中的最小元素。

      以最大堆为例,如果删除一个最大堆的堆顶(并不是完全删除,而是跟末尾的节点交换位置),经过自我调整,第2大的元素就会被交换上来,成为最大堆的新堆顶。 

二、堆排序

算法>排序算法步骤:

1、把无序数组构建成二叉堆。

            从小到大排序,则构建成最大堆;

            从大到小排序,则构建成最小堆。

2、循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。

        第1步,把无序数组构建成二叉堆,这一步的时间复杂度是O (n)。

        第2步,需要进行n-1次循环。每次循环调用一次down_adjust方法,所以第2步的计算规模是(n-1) xlogn,时间复杂度为O ( nlogn) 。

        两个步骤是并列关系,所以整体的时间复杂度是O (nlogn)。

 如图所示:

 

def down_adjust(p_index,length,ll):'''下沉:param p_index:  父节点索引:param length:  大小:param ll:  数列:return:'''#保存父节点元素temp=ll[p_index]#左子节点索引sub_index=2*p_index+1#循环while sub_index <length:# 如果有右孩子,且右孩子的值大于左孩子的值,则定位到右孩子if sub_index+1<length and ll[sub_index+1]>ll[sub_index]:sub_index+=1# 如果父节点的值>=任何一个孩子的值,直接跳出if temp>=ll[sub_index]:break#无需真正交换#子节点元素赋给父节点元素ll[p_index]=ll[sub_index]#子节点索引重新赋值给父节点索引p_index=sub_index#子节点索引sub_index = 2 * sub_index + 1#父节点元素ll[p_index]=tempdef heapSort(ll):#1.把无序数组构成最大堆for i in range((len(ll)-2)//2,-1,-1):down_adjust(i,len(ll),ll)#2.循环删除堆顶元素,替换到二叉堆的末尾,调整堆产生新的堆顶。for i in range(len(ll)-1,0,-1):#最后一个与第一个元素交换t=ll[i]ll[i]=ll[0]ll[0]=t#下沉调整最大堆down_adjust(0,i,ll)if __name__ == '__main__':ll = [10, 8,9, 7, 5, 4, 6, 3,2]print('排序前:')print(ll)# 调用方法排序heapSort(ll)print('排序后:')print(ll)

 

 相同点,堆排序和快速排序的平均时间复杂度都是O (nlogn),并且都是不稳定排序。

 不同点,快速排序的最坏时间复杂度是O (n2),而堆排序的最坏时间复杂度稳定在O (nlogn)。

 


http://www.ppmy.cn/devtools/12183.html

相关文章

java:基于guava ClassPath工具实现基于包名(package)的类扫描

google的guava库提供了一个类路径扫描的实用工具ClassPath(参见说明&#xff1a; https://github.com/google/guava/wiki/ReflectionExplained#classpath)工具&#xff0c;适用于非android的Java平台搜索类。基于它可以设计一个过滤包名的搜索工具。 导入依赖库 <dependen…

SL7220线性降压恒流3.6A 外围只需两个电阻 耐压40V汽车大灯IC

概述&#xff1a; SL7220 是一款双路线性降压LED恒流驱动器&#xff0c;外围只需两个电阻&#xff0c;输出电流10MA-3600MA。 SL7220 内置过热保护功能&#xff0c;内置输入过压保护功能。 SL7220 静态电流典型值为120uA。 特点 ●输入电压范围&#xff1a;2.5V-40V ●电…

ajax使用案例

1.index.jsp页面&#xff1a; 下边是采用JavaScript的ajax发出异步请求。 <% page language"java" contentType"text/html; charsetUTF-8" pageEncoding"UTF-8"%> <%String basePath request.getScheme()"://" request.ge…

oracle varchar2类型如何转化为date类型

ALTER TABLE unit_bin_h ADD TRANS_TIME_TEMP DATE; –处理中文 上午/下午 –UPDATE unit_bin_h SET TRANS_TIME_TEMP TO_CHAR(TO_TIMESTAMP(trans_time, ‘dd-mon-rr hh.mi.ss.ff am’), ‘yyyy-MM-dd hh24:mi:ss’) WHERE TRANS_TIME LIKE ‘%下午’ OR TRANS_TIME LIKE ‘%…

OpenHarmony实战开发-内存快照Snapshot Profiler功能使用指导。

DevEco Studio集成的DevEco Profiler性能调优工具&#xff08;以下简称为Profiler&#xff09;&#xff0c;提供Time、Allocation、Snapshot、CPU等场景化分析任务类型。内存快照&#xff08;Snapshot&#xff09;是一种用于分析应用程序内存使用情况的工具&#xff0c;通过记录…

HarmonyOS开发案例:【音乐播放器】

介绍 使用ArkTS语言实现了一个简易的音乐播放器应用&#xff0c;主要包含以下功能&#xff1a; 播放应用中的音频资源文件&#xff0c;并可进行上一曲、下一曲、播放、暂停、切换播放模式&#xff08;顺序播放、单曲循环、随机播放&#xff09;等操作。结合后台任务管理模块&…

MediaStream使用webRtc多窗口传递

最近在做音视频通话&#xff0c;有个需求是把当前会话弄到另一个窗口单独展示&#xff0c;但是会话是属于主窗口的&#xff0c;多窗口通信目前不能直接传递对象&#xff0c;所以想着使用webRtc在主窗口和兄弟窗口建立连接&#xff0c;把主窗口建立会话得到的MediaStream传递给兄…

Halide 高效的图像处理语言 简化图像编程

Halide 高效的图像处理语言 简化图像编程 github源码 Halide是用C作为宿主语言的一个图像处理相关的DSL(Domain Specified Language)语言&#xff0c;全称领域专用语言。 主要的作用为在软硬层面上(与算法本身的设计无关)实现对算法的底层加速&#xff0c;我们有必要对其有一…