【0】README
1)本文旨在给出 推排序的源码实现;堆排序是基于二叉树的数组实现的;
【1】堆排序步骤
step1)对排序数据建堆,执行 n 次 insert 操作(基于上滤操作);每次 insert 包括 将 新元素插入到堆末尾,然后执行 上滤操作;
step2)执行 n 次 deleteMin 操作(基于下滤操作),每一次 deleteMin 操作都包含 将 堆的根元素 和 堆最后一个元素交换,并对根 执行 下滤操作;
step3)经过 deleteMin 操作后, 堆所在的数组中的元素是 逆序的;
Conclusion)由此可见,堆排序的关键操作是 上滤操作 和 下滤操作;
【2】源码实现(for full source code, please visit  https://github.com/pacosonTang/dataStructure-algorithmAnalysis/tree/master/chapter7/review/p170_heap_sort )

1)insert插入操作(基于上滤操作)
// 插入操作 based on 上滤操作.
void insert(BinaryHeap heap, ElementType data)
{if(heap->size == heap->capacity-1){Error("failed insert() for heap is full.");}  percolateUp(heap, data);
}// 上滤操作(key operation)
void percolateUp(BinaryHeap heap, ElementType data)
{int i;// 必须将size++.for(i=++heap->size; data < heap->array[i/2]; i/=2){heap->array[i] = heap->array[i/2];}heap->array[i] = data;
}

2)deleteMin操作(基于下滤操作)

// delete minimal from heap based on percolateDown().
void deleteMin(BinaryHeap heap)
{   if(heap->size==0){Error("failed deleteMin() for the heap is empty");return ;}    swap(&heap->array[1], &heap->array[heap->size--]); // 将二叉堆的根和二叉堆的最后一个元素交换,size--。percolateDown(heap, 1); // 执行下滤操作.
}// 下滤操作(key operation)
void percolateDown(BinaryHeap heap, int i)
{int child;int temp;    for(temp=heap->array[i]; (child=leftChild(i))<=heap->size; i=child){               if(child<heap->size && heap->array[child] > heap->array[child+1]){child++;}if(temp > heap->array[child]) // 比较是和 temp=heap->array[index] 进行比较.{         heap->array[i] = heap->array[child];}else{                   break;}}heap->array[i] = temp;
}int leftChild(int index)
{return 2*index;
}// swap a and b.
void swap(ElementType* a, ElementType* b)
{ElementType t;t = *a;*a = *b;*b = t;
}
对以上代码的分析(Analysis):(最难实现的就是 下滤操作)
A1)第21行 的 child<heap->size 是必须需要的,不要认为 它 和 第19行的 (child=leftChild(i))<=heap->size 雷同了,因为有可能 该节点只有左孩子,而没有右孩子;
A2)如下图所示,size=4的堆:节点53就只有左孩子而没有右孩子,所以第21行是不需要执行的,这通过 child<heap->size 来控制;


3)打印结果


ReviewForJob——堆排序相关推荐

  1. 排序算法 - 堆排序

    堆排序是指利用堆这种数据结构所设计的一种排序算法. 类型:选择排序 时间复杂度(最坏):O(nlogn) 时间复杂度(最好):O(nlogn) 时间复杂度(平均):O(nlogn) 空间复杂度:O(1 ...

  2. 白话经典算法系列之七 堆与堆排序

     堆排序与高速排序,归并排序一样都是时间复杂度为O(N*logN)的几种常见排序方法.学习堆排序前,先解说下什么是数据结构中的二叉堆. 二叉堆的定义 二叉堆是全然二叉树或者是近似全然二叉树. 二叉堆满 ...

  3. MYSQL实现ORDER BY LIMIT的方法以及优先队列(堆排序)

    一.MYSQL中的LIMIT和ORACLE中的分页 在MYSQL官方文档中描述limit是在结果集中返回你需要的数据,它可以尽快的返回需要的行而不用管剩下的行, 在ORACLE中也有相关的语法比如 1 ...

  4. 插入排序,希尔排序,堆排序

    本文将介绍三种排序算法--插入排序,希尔排序,堆排序.本文所有例子都是使用升序 一.插入排序 算法思想 维护一个有序数组,将要插入的数据与有序数组自最后一个元素直到合适位置的数一一比较. eg: 有序 ...

  5. (C++)堆排序的3个关键函数

    堆排序:指使用堆结构对一个序列进行排序.所以,首先要有一个堆结构. 此处讨论递增排序.以及用最大堆. 注意:让存放堆的数组作为全局变量,n为元素个数,数组存放元素从下标1开始,n结束. int hea ...

  6. 排序算法java版,速度排行:冒泡排序、简单选择排序、直接插入排序、折半插入排序、希尔排序、堆排序、归并排序、快速排序...

    先推荐一篇关于排序算法的文章:http://www.cppblog.com/guogangj/archive/2009/11/13/100876.html 本文思路部分来源于上篇文章,但测得的结果似乎 ...

  7. 排序算法总结之堆排序

    一,堆排序介绍 堆是一个优先级队列,对于大顶堆而言,堆顶元素的权值最大.将 待排序的数组 建堆,然后不断地删除堆顶元素,就实现了排序.关于堆,参考:数据结构--堆的实现之深入分析 下面的堆排序算法将数 ...

  8. Python最大堆排序实现方法

    Python最大堆排序实现方法,具体代码如下:   # -*- coding: utf-8 -*-   def merge_sort(seq, cmp=cmp, sentinel=None):     ...

  9. 【算法学习】堆排序建立最大堆

    本文代码均转自: 作者:早就戒了 来源:CSDN 原文:https://blog.csdn.net/qq_37169817/article/details/79777264 版权声明:本文为博主原创文 ...

最新文章

  1. 究竟有多少假代购,在2亿多海淘用户市场里浑水摸鱼?
  2. linux启用root用户,Ubuntu 下启用root账号与修改密码
  3. SQL语言之DQL语言学习(七)分组查询
  4. gorm的零值问题:默认仅更新非零值
  5. Dsp BootLoader的学习
  6. 微软MCP之SharePoint2007考试试题(Microsoft 70-542)
  7. 程序员如何打破 30 岁职业瓶颈?
  8. 华北电力大学依托大数据实施精准资助
  9. 关于本地yum源的创建方法和使用
  10. win10 退出误登的微软账号,无需改注册机,无需重置系统
  11. Excel选中单元格光标一直闪
  12. 原神android和苹果,原神安卓苹果数据互通吗
  13. 使用PS调整图片大小
  14. 括弧匹配检验:比较基础的栈
  15. 【Python机器学习预测分析算法实战五】最小角回归LARS
  16. chain.doFilter
  17. 【mysql】ALTER TABLE causes auto_increment resequencing, resulting in duplicate entry ’1′ for key ‘PR
  18. sqlalchemy.exc.ArgumentError: Mapper mapped class NewsLoog->news_loog could not assemble any primary
  19. 十大酷炫屌的图像悬停特效
  20. 无盘服务器汇聚,Microsoft PowerPoint - 网吧无盘系统网卡汇聚与交换机汇聚教程(包会).pdf...

热门文章

  1. H - Tunnel Warfare HDU - 1540
  2. [ZJOI2010]网络扩容[网络流24题]
  3. BZOj #4771. 七彩树(主席树+dfn序+lca)
  4. [多校联考-西南大学附中]切面包(线段树/概率与期望)+ Slow Path Finding Algorithm(拓扑排序/DP)+ 分数转化(数论)
  5. YBTOJ洛谷P4551:最长异或路径(trie树)
  6. P6113-[模板]一般图最大匹配【带花树】
  7. 亿些模板【数论数学】
  8. P3870-[TJOI2009]开关【分块】
  9. Codeforces Round #675 (Div. 2)——F主席树待补?
  10. 线段树动态开点区间加区间求和