什么是堆排序算法,堆的排序算法

  什么是堆排序算法,堆的排序算法

  计算机编程语言

  两叉)。

  两座山是特殊的山,两座山是完全二叉树或几乎完全二叉树。二叉堆满足堆的特性。父节点的键值总是以固定的顺序排列。不管是哪个子节点的键值,每个节点的左右子树都是二进制堆。

  如果父节点的键值总是大于或等于任何子节点的键值,则最大堆数为。如果父节点的键值始终小于或等于任何子节点的键值,则为最小堆。

  二进制堆栈存储器

  二岔山一般用排列来表示。如果根节点在数组中的位置为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))

  测试() )

什么是堆排序算法,堆的排序算法