Tel:

解读堆排序算法及用C++实现基于最大堆的堆排序示例_C 语言




1、堆排序的解释
保留字序列KL,K2,…,高压地带堆,当且仅当序列目录以下属性(缩写词,:
(1) ki≤K2i且ki≤K2i+1 或(2)Ki≥K2i且ki≥K2i+1(1≤i≤   )
假使相应地序列的带菌者r [ 1…n ]回忆为赋的回忆妥协,堆是本人丰富的的二叉树目录以下:树中任一非叶要点的保留字均不大于(或不不足)其摆布孩子(若在)要点的保留字。
中枢词序列(10,15,56,25,30,70)和(70,56,30,25,15,10)辨别是非目录堆属性(1)和(2)。,因而他们是堆,其相配的丰富的的二叉树像最小堆回旋。
堆排序算法

201668104003619.png (522×378)

2、最大堆和最小堆
(1)根要点(亦称为堆顶)的保留字是堆里缠住要点保留字中最小者的堆称为最小堆。
(2)杂种的的中枢(也称为堆顶)是最大的O。,称为最大堆。
注意到:
(1)究竟哪一身长树亦堆堆。。
(2)不只是议论的真是两个叉堆堆(二元系 堆),相似地K叉堆的解释。

3、堆排序的根本思惟
(1)将整理阻碍构形成最大堆
(2)取树的根(最大(小)值, 现实算法的赚得并缺席真正实现)
(3)将树的过剩的元素重组为最大堆(,在赚得地区的详细观念
(4)反复2,3调整,直到缠住的元素
(5)按使滴下连续各元素。,本人整理阻碍(在详述遗传密码赚得中是经过序列实现的。
看一眼处决的算法的开端的数个推论
(1)丰富的的两叉树射中靶子究竟哪一个杂种的a [ 0:n-1 ],其下标 ii, 后来地孩子杂种的的下标是12i 2I 1 和 2(i+1)2(i+1)
(2)本人丰富的的二叉树A(0:n-1)n按大小排列,下标最小的叶杂种的N2 N2, 下标非叶杂种的是最大N2 n2 - 1 - 1。
(3)假使阻碍是本人最大的桩,因而最大的元素是本人[ 0 ]
(4)摆布子树的究竟哪一个杂种的都是最大堆最大堆。
4、赚得的诉讼
嗨的算法采取最大堆,率先来处置由阻碍扩展最大堆的成绩:

// 两身长杂种的与子杂种的的下标值计算
#define 距(我) (2 * (i) + 1)
#define 对(我) (2 * ((i) + 1))
         
/* 相应地行使职责是本人两棵二叉树,根杂种的树的一定尺寸的为。
 * 注意到: 必须先具备的是运用 node杂种的的摆布子树(假使在的话)都是最大堆。
 * 相应地行使职责是算法的中枢。。
 */
void max_heapify(int heap[], int heap_size, int 杂种的)
{
  // 整体附加赛的成绩,嗨不思索。
  // 率先,集合在主要效能
  // 假使档案测量够大,int典型绑定到附加赛
  int l_child = LEFT(杂种的);
  int r_child = RIGHT(杂种的);
  int max_value = node;
 
  if (l_child < heap_size && heap[l_child] > heap[max_value])
  {
    max_value = l_child;
  }
  if (r_child < heap_size && heap[r_child] > heap[max_value])
  {
    max_value = r_child;
  }
  if (max_value != 杂种的)
  {
    swap_val(堆 + node, heap + max_value);
 
    // 后来的还要以誓言约束被序列的子杂种的由 ... 组成的子树依然是最大堆
    // 假使缺席相应地杂种的将持续下沉,直到独特的的安置
    max_heapify(堆, heap_size, max_value);
  }
}
 
/* 排列本人阻碍的最大堆
 * 从英尺到max_heapify行使职责处置的运用
 */
void build_max_heap(int heap[], int heap_size)
{
  if (堆_size < 2)
  {
    return;
  }
  int first_leaf = heap_size >> 1;//第本人叶子及梗和枝杂种的的下标
 
  int i;
  // 从下到上的非叶杂种的开端,
  // 叶子及梗和枝杂种的被以为是最大的堆。,因而你可以运用max_heapify效能
  for (i = first_leaf - 1; i >= 0; i--)
  {
    max_heapify(堆, heap_size, i);
  }
}

效能max_heapify汇详述的子树的根杂种的, 终极子树发生最大的堆。, 最可惜的时期复杂的事物为O(logN)O(log n)。效能build_max_heap自下而上的工具max_heapify, 基本事实,整体阻碍目录最大堆。,为O(nlogn)的迭代转换的复杂的事物O(nlog n), 相应地,最复杂的全效能的时期是O(nlog。 假使阻碍先前是最大的堆,比如,阻碍是递减次序, 后来地,时期复杂的事物是O max_heapify转换(1)O(1), build_max_heap的时期复杂的事物为O(n)O(N),这是最好的诉讼。。

后来地赚得堆排序转换:

/* heap sort 主行使职责
 */
void heap_sort(int heap[], int heap_size)
{
  if (堆 == NULL || heap_size < 2)
  {
    return;
  }
  //排列最大堆
  build_max_heap(堆, heap_size);
 
  int i;
  for (i = heap_size - 1; i > 0; i--)
  {
    /* 将流行的树的根杂种的序列到完毕
     * 相当于取出最高值,这棵树的按大小排列比较小。。
     * 序列后的树做错最大的堆。,但两子树的根依然最大堆
     * 打工具max_heapify要求。这种交流的导致,
     * 鉴于具有较低的时期复杂的事物max_heapify,
     * 假使不序列,指导堆出堆[ 0 ]。, 它可以在嗨运用。
     * build_max_heap重行扩展最大堆,时期复杂的事物较大
     */
    swap_val(堆, heap + i);
 
    heap_size--;
    的最大堆的技术维护
    max_heapify(堆, heap_size, 0);
  }
}

终极的堆排序算法中,build_max_heap的复杂的事物是人所共知的。, 迭代地区相似地build_max_heap进行,不难看出, 使移近构造桩下沉后序列的根元素,相应地,其中的哪一个存亡绝续, 迭代算法的时期复杂的事物为O(nlogn)O(nlog n), 因而整体算法的最好最坏和相等地时期复杂的事物都是O(nlogn)O(nlog⁡n)。
堆排序算法的未填写的复杂的事物是O(1)O(1),从赚得中宽裕的看出。。

  • 个人违纪检讨书
  • 关于滑冰的作文500字
  • 2017年第二届广州国际营养