什么是堆排序算法,堆的排序算法
计算机编程语言
两叉)。
两座山是特殊的山,两座山是完全二叉树或几乎完全二叉树。二叉堆满足堆的特性。父节点的键值总是以固定的顺序排列。不管是哪个子节点的键值,每个节点的左右子树都是二进制堆。
如果父节点的键值总是大于或等于任何子节点的键值,则最大堆数为。如果父节点的键值始终小于或等于任何子节点的键值,则为最小堆。
二进制堆栈存储器
二岔山一般用排列来表示。如果根节点在数组中的位置为1,则第n个位置的子节点分别为2n和2n-1。因此,第一个位置的子节点位于2和3,第二个位置的子节点位于4和5。诸如此类。这个基于1的数组可以很容易地找到父节点和子节点。
当存储数组的下标以0为基数时,下标为I的节点的子节点为2i 1和2i 2;它的父节点的下标是什么?loor())我?12?此外,函数floor(x)具有舍入或舍入的功能,即x以下的最大整数(与舍入不同,舍入是指直接取数值轴上最接近所需值的左边值,即所需值以下的最大值)。例如,floor(1.1)和floor(1.1)都返回1。
下图中的两个堆:
将这两个堆保存到一个从1开始的数组中。
地点:1 2 3 4 5 6 7 8 9 10 11
左:1 2 3 4 5 6 7 8 9 10 11
右:11 9 10 5 6 7 8 1 2 3 4
对于山区来说,这样的存储效率很低。因为该节点的子节点很可能在其他内存页面上。-B-heap是一种更高效的存储方法,它将每个子树放在同一个内存页面上。
如果你使用指针链表来存储堆,你需要一种方法来访问叶节点。您可以通过遍历二叉树来依次遍历这些节点。
基本操作
插入节点
在数组末尾插入一个新节点。然后,子节点和父节点的当前节点时间的复杂度(称为up-heap或bubble-up,渗滤液向上,sift-up,trickle up,heapify-up-up,cascade-up操作)为o(logn)。
删除节点
删除根节点进行排序。
对于最大堆,删除根节点意味着删除最大值。如果是最小堆,请删除最小值。然后,将堆存储的最后一个节点移动到根节点中的填充位置。从上到下调整父节点及其子节点。对于最大堆,如果父节点小于具有最大值的子节点,那么两者都将被交换。将此操作转换为向下堆积或向下冒泡、向下过滤、向下筛选、向下渗透、向上堆积、向下层叠、向下提取。
位于山脚和河边
一种直观的方法是从单个节点的二进制堆开始,一次插入一个节点。其时间复杂度为{ displaystyleo(n logn)} o)n)logn)。
最好的算法是Max-Heapify算法,从配置了任意节点元素的二叉树开始,自下而上删除每个子树的根节点。对于最大的堆,当前子树被解析为二叉树堆。具体来说,假设一些高度为h的树堆成两股。对于一些高度为h 1的树,要沿最大部分节点的分支调整根节点,最多需要在步骤h中堆成两股。可以证明该算法的时间复杂度为o(n)。
密码
#!/usr/zxdxt/env python2
#-*-编码:utf-8-*-
""
@作者:gsharp
""
类二进制帮助:
def __init__(self,n):
self.heap=[0] * n
self.size=0
efremove_min(self):
removed=self.heap[0]
self.size -=1
self . heap[0]=self . heap[self . size]
自我。_down(0)).
退货已移除
默认添加(自我,价值) :
self . heap[self . size]=值
自我。_up(self.size))。
self.size=1
def_up(自身,位置) :
当位置0:
零件=(位置1 )/2
if self . heap[pos]=self . heap[parent]:
黑色
self.heap[pos]、self . heap[parent]=self . heap[parent]、self.heap[pos]
pos=母公司
def_down(自身,位置) :
虽然正确:
子代=2 *位置1
if child=self.size:
黑色
if child 1 self . sizeandself . heap[child 1]self . heap[child]:
孩子=1
if self . heap[pos]=self . heap[child]:
黑色
self.heap[pos]、self . heap[child]=self . heap[child]、self.heap[pos]
位置=子代
定义测试() :
h=binaryheap(10))。
h.add(5)。
h.add(7)。
h.add(9))。
h.add(4))。
h.add(3))。
打印(希普).
h.add(1))。
打印(希普).
h.add(2))。
打印(希普).
打印(h.remove_min))
打印(h.remove_min))
打印(h.remove_min))
测试() )