堆排序python代码实现_python实现堆排序

首先理解堆排序:

堆:

堆栈是计算机的两种最基本的数据结构。堆的特点就是FIFO(first in first out)先进先出,这里的话我觉得可以理解成树的结构。堆在接收数据的时候先接收的数据会被先弹出。栈的特性正好与堆相反,是属于FILO(first in/last out)先进后出的类型。栈处于一级缓存而堆处于二级缓存中。这个不是本文重点所以不做过多展开。

思想:

本质是使用大根堆或小根堆来对一个数组进行排序。所以首先要理解树的概念,若是不太理解树的概念可以自行百度。

完全二叉树:

堆是一种完全二叉树,就是除了最后一层之外的其他每一层都被完全填充,并且所有结点都保持向左对齐的树。就像码金字塔的砖块,必须从头到底,从左到右一个一个码,不能空缺。。

大根堆小根堆定义:

大根堆:每个结点的值都大于或等于左右子结点

小根堆:每个结点的值都小于或等于左右子结点

大根堆

小根堆

关于数组下标

将一个数组构建成二叉树的结构,那么对于其中某一个元素的index假设为n,满足以下条件:

1)它的父节点若存在,父节点的index为n//2(n//2指n除以2取整数)

2)若是左子节点存在,index为2*n

3)若是右子节点存在,index为2*n+1

注意:以上条件是在index是从1开始才满足,所以在后面计算中会在数组第一个位置添加一个[0]作为占位元素。

操作步骤:

以由对数组从小到大进行排序的情况,需要构建大根堆。

1.首先将整个数组进行构建一个大根堆得到[0,R1,....,Rn](具体实现后面讲)

2.由于R1是最大的数,所以把R1与Rn改变位置,变成[0,Rn,...,Rn-1,R1],此时[0,Rn...,Rn-1]是无序的,[R1]是有序的

3.对数组[0,Rn...,Rn-1]进行重构大根堆,得到[0,R2,....,Rn-1]

4.由于R2是最大的数,所以把R2与Rn-1改变位置,变成[0,Rn-1,...Rn-2,R2,R1],此时[0,Rn-1...,Rn-2]是无序的,[R2,R1]是有序的

5.重复以上步骤,直到无序列表只有[0],最终得到的有序序列则是按照从小到大规律排列的。

为了能更好的理解上面的话,我推荐看b站这个视频演示。。https://www.bilibili.com/video/av18980178?from=search&seid=3518072115040122033

代码:

1 importmath,random2

3 #网上找的打印树的一个函数,很好用,谁用谁知道

4 def print_tree(array): #打印堆排序使用

5 '''

6 深度 前空格 元素间空格7 1 7 08 2 3 79 3 1 310 4 0 111 '''

12 #first=[0]

13 #first.extend(array)

14 #array=first

15 index = 1

16 depth = math.ceil(math.log2(len(array))) #因为补0了,不然应该是math.ceil(math.log2(len(array)+1))

17 sep = ' '

18 for i inrange(depth):19 offset = 2 **i20 print(sep * (2 ** (depth - i - 1) - 1), end='')21 line = array[index:index +offset]22 for j, x inenumerate(line):23 print("{:>{}}".format(x, len(sep)), end='')24 interval = 0 if i == 0 else 2 ** (depth - i) - 1

25 if j < len(line) - 1:26 print(sep * interval, end='')27 index +=offset28 print()29

30 defsort(arr,start,end):31 if end == start * 2:32 if arr[start * 2] >arr[start]:33 arr[start * 2], arr[start] = arr[start], arr[start * 2]34 else:35 if end < start * 2 + 1:36 return

37 else:38 left = arr[start*2]39 right = arr[start*2+1]40 if left>right and left >arr[start]:41 arr[start * 2 ], arr[start] = arr[start], arr[start * 2]42 sort(arr,start*2,end)43 if leftarr[start]:44 arr[start * 2+1], arr[start] = arr[start], arr[start * 2+1]45 sort(arr, start * 2+1, end)46

47 defheapfiy(arr):48 x = len(arr) - 1

49 n = x // 2

50 while n >0:51 #print(n)

52 sort(arr, n, x)53 n -= 1

54

55 #以下是主函数

56

57 #第一个0是占位用

58 orignal_list=[0, 74, 73, 59, 72, 64, 69, 43, 36, 70, 61, 40, 16, 47, 67, 17, 31, 19, 24, 14, 20, 48, 5, 7, 3, 78, 84, 92, 97, 98, 99]59 print(orignal_list)60 #第一次构建最大堆

61 heapfiy(orignal_list)62 #打印树

63 print_tree(orignal_list)64

65 x= len(orignal_list) - 1

66 while x!=1:67 #交换最大的数和最后一个

68 orignal_list[1],orignal_list[x]=orignal_list[x],orignal_list[1]69 x-=1

70 #由于交换了,不再是最大堆,重新构建最大堆

71 n=x//2

72 while n>0:73 sort(orignal_list,n,x)74 n-=1

75

76 #打印最后结果

77 print_tree(orignal_list)78 print(orignal_list)

结果如下

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/427021.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

jq多选框全选,多选

html代码 <input type"hidden" name"f_information_id" id"f_information_id" value"<?php echo $f_information_id?>"> <table class"table table-hover"><thead><tr><th> <inpu…

无人驾驶技术(1)

无人驾驶汽车有望将在未来20年内得到广泛运用&#xff0c;各大科技公司和汽车厂商均在加大对无人驾驶的投入&#xff0c;资本也纷纷抢滩该万亿市场。 无人驾驶汽车依靠人工智能、视觉计算、雷达、监控装置和全球定位系统协同合作&#xff0c;通过电脑实现无人驾驶&#xff0c;可…

php html登陆逻辑,保持演示文稿(HTML)和逻辑(PHP)分开

我试图保持演示和逻辑分离,而不使用像Smarty这样的模板引擎.到目前为止我所做的工作是有效的,但我不知道如果不在我的演示文稿中添加更多PHP而不是我想做的事情.例如,现在我有这样的事情&#xff1a;product_list.phptry {$query $conn->prepare("SELECT p.id,p.name,…

层次分析法matlab_建模开讲课程回放2:层次分析法及其MATLAB

建模开讲&#xff1a;层次分析法及其MATLAB实践主讲人&#xff1a;于晶贤老师课程回放地址如下&#xff0c;大家可以复制链接到地址栏即可观看&#xff0c;也可以直接点击左下角的观看&#xff1a;https://ke.qq.com/webcourse/index.html?fromqqchat&cid493154&term_…

raw input()和input区别

版本差异 raw_input——》python2版本 input——》python3版本 2. 输入格式差异 就是raw_input()随便输都是字符串&#xff0c;而input()必须按照Python的规则来~ raw_input() nameraw_input(‘输入姓名&#xff1a;’) ageraw_input(‘输入年龄’) 我们输入汉字的姓名和数…

防抖debounce和节流throttle

大纲 一、出现缘由 二、什么是防抖debounce和节流throttle 三、应用场景 3.1防抖 3.2节流 一、出现缘由 前端开发中&#xff0c;有一部分用户行为会频繁触发事件&#xff0c;而对于DOM操作&#xff0c;资源加载等耗费性能的处理&#xff0c;很可能导致卡顿&#xff0c;甚至浏览…

不同vlan之间如何ping通_【丰润达.安防百科】如何实现交换机不同VLAN、不同网段之间互访?...

交换机如何实现不同网段的互访&#xff1f;这个交换机完全可以实现&#xff0c;在实际项目中&#xff0c;交换机实现不同网段的互访用的也比较多&#xff0c;那么今天我们一起来看下。▎同一个vlan中&#xff0c;不同网段的主机如何互通同一个vlan&#xff0c;不同网段的主机如…

oracle字段加约束,Oracle数据库的字段约束创建和维护示例

创建Oracle数据库的字段约束&#xff1a;非空约束唯一约束对字段的取值的约束默认值外键约束create table tab_class(class_id number primary key,class_name varchar2(10) not null unique);create table tab_stu(stu_id number,--学生姓名&#xff0c;不能为空&#xff0c;不…

实例5:python

#输入三个整数x,y,z&#xff0c;请把这三个数由小到大输出。 l [] for i in range(3): x int(input(‘integer:\n’)) l.append(x) l.sort() print (l)

python识别节假日_Python3自动签到 定时任务 判断节假日的实例

不废话&#xff0c;直接上代码Python3.6签到代码&#xff0c;只需修改url&#xff0c;账号&#xff0c;密码即可&#xff0c;此处是登录时无验证登录&#xff0c;有验证码的自行补充# -*- coding:utf-8 -*-import jsonimport urllib.requestimport datetime# 模拟浏览器打开网站…

[BZOJ 5074] 小B的数字

题目传送-BZOJ5074 题意&#xff1a; T组数据 你有一个数组\(A\)&#xff0c;要求一个数组\(B\)\(B\)中的数都是2的正整数次幂。 令\(x\prod_{i1}^nB_i\),有\(x|B_i^{A_i},i\in1,2,3,...,n\)成立\(T \le 10,n \le 100000\) 题解&#xff1a; 首先\(B\)可以直接转化为每个元素的…

matlab数学实验第七章课后答案,matlab数学实验第七章答案

参考答案如下[单选,共用题干题] 患者男性&#xff0c;数学实验35岁&#xff0c;数学实验4天前因不慎划破皮肤后出现高热、皮肤瘀斑来院。查体&#xff1a;体温39.1℃&#xff0c;血压110&#xff0f;70mmHg&#xff0c;呼吸30次&#xff0f;分&#xff0c;心率107次&#xff0f…

Python List sort()方法

描述 sort() 函数用于对原列表进行排序&#xff0c;如果指定参数&#xff0c;则使用比较函数指定的比较函数。 语法 sort()方法语法&#xff1a; list.sort(cmpNone, keyNone, reverseFalse) 参数 • cmp – 可选参数, 如果指定了该参数会使用该参数的方法进行排序。 • key –…

oracle sql-1,Oracle – Oracle SQL(1)

Oracle – Oracle SQL(1)1. 简介(1) SQL : Structured Query Language&#xff0c;结构化查询语言&#xff0c;专门用于数据存取、数据更新及数据库管理等操作。(2) Oracle SQLDDL: Data Define Language数据定义语言包括CREATE、ALTER、DROP、TRUNCATE、COMMENT、RENAME等命令…

背景图层和普通图层的区别_008Photoshop四赞图层(图层样式)

图层过滤器图层滤镜&#xff0c;比如你只想看到像素图层&#xff0c;选择像素图层过滤器&#xff0c;这时就只能看到背景图层了(在图层面板)&#xff0c;如果再点击像素图层过滤器&#xff0c;其他图层又出现了。选中调整图层过滤器&#xff0c;就只能看到图层结构里的调整图层…

洛谷P3628 [APIO2010]特别行动队(斜率优化)

传送门 先写出转移方程$$dp[i]max\{dp[j]a*(sum[i]-sum[j])^2b*(sum[i]-sum[j])c\}$$ 假设$j$比$k$更优&#xff0c;则有$$dp[j]a*(sum[i]-sum[j])^2b*(sum[i]-sum[j])c>dp[k]a*(sum[i]-sum[k])^2b*(sum[i]-sum[k])c$$ 展开&#xff0c;并消去同类项之后得$$dp[j]-2*a*sum[i…

实例6:python

#斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;指的是这样一个数列&#xff1a;0、1、1、2、3、5、8、13、21、34、……。 #F0 0 (n0) #F1 1 (n1) #Fn F[n-1] Fn-2 #!/usr/bin/python -- coding: UTF-8 -- #def fib(…

简述oracle的主要数据库对象,Oracle数据库数据对象分析

Oracle数据库数据对象分析Oracle数据库数据对象中最基本的是表和视图&#xff0c;其他还有约束、序列、函数、存储过程、包、触发器等。对数据库的操作可以基本归结为对数据对象的操作,理解和掌握Oracle数据库对象是学习Oracle的捷径。表和视图Oracle中表是数据存储的基本结构。…

vue devtools面板没有显示_vue 基础入门(四)

vue 基础入门(四)1.全局配置Vue.config 是一个对象&#xff0c;包含 Vue 的全局配置。可以在启动应用之前修改下列 property&#xff1a;1.1 silent类型&#xff1a;boolean默认值&#xff1a;false用法&#xff1a;Vue.config.silent true❝取消 Vue 所有的日志与警告。❞1.2…

SpaceVim 语言模块 lua

原文连接&#xff1a; https://spacevim.org/cn/layers/lang/lua/ 模块简介启用模块快捷键 交互式编程运行当前脚本模块简介 这一模块为在 SpaceVim 中进行 lua 开发提供了支持&#xff0c;包括代码补全、语法检查、代码格式化、交互式编程以及调试等特性。 启用模块 可通过在配…