数据结构示例——堆排序过程

完整算法见[例程],本文用一个例子,演示堆排序的过程。

例:对{57, 40, 38, 11, 13, 34, 48, 75, 6, 19, 9, 7}进行堆排序的过程。

算法如下:

void HeapSort(RecType R[],int n)
{
    int i;
    RecType temp;
    //(1)循环建立初始堆
    for (i=n/2; i>=1; i--)
        sift(R,i,n);
    //(2)进行n-1次循环,完成推排序
    for (i=n; i>=2; i--)
    {
        temp=R[1];       //将第一个元素同当前区间内R[1]对换
        R[1]=R[i];
        R[i]=temp;
        sift(R,1,i-1);   //筛选R[1]结点,得到i-1个结点的堆
    }
}

(1)循环建立初始堆

    for (i=n/2; i>=1; i--)
        sift(R,i,n);

用给出的序列构造堆的初始状态如下:

在此基础上,根据上述代码,从最后一个分支节点开始调整,目标是得到大根堆。过程如下图:

这个堆的存储结构是:

(2)进行n-1次循环,完成推排序

    for (i=n; i>=2; i--)
    {
        temp=R[1];       //最大值交换到最后
        R[1]=R[i];
        R[i]=temp;
        sift(R,1,i-1);   //前面的无序区调整为堆
    }

过程图示如下:

请继续补充画完。

时间: 2024-09-17 08:02:23

数据结构示例——堆排序过程的相关文章

堆排序过程中的调整问题

问题描述 堆排序过程中的调整问题 当孩子节点大于双亲节点,如何交换两者的位子,图中方框中的i=j:j=2*i:是什么意思? 解决方案 http://blog.csdn.net/caimo/article/details/7783970 解决方案二: 性能测试过程中的问题

PHP常用算法和数据结构示例(必看篇)

实例如下: </pre><pre name="code" class="php"><?php /** * Created by PhpStorm. * User: qishou * Date: 15-8-2 * Time: 上午9:12 */ header("content-type:text/html;charset=utf-8"); $arr = array(3,5,8,4,9,6,1,7,2); echo im

数据结构之堆排序

在数据结构中,堆排序是非常重要的一个知识点,尤其像在期末考试.考研等计算机考试中经常会考察堆排序,并要求画出示意图.下面主要通过一道考研题目讲述堆排序的知识,希望对大家有所帮助. (文章内容参考严蔚敏的<数据结构>.王道论坛的<数据结构>和自己的一些理解) 参看动态图:http://www.benfrederickson.com/heap-visualization/ 一.堆排序定义 堆排序是一种树形选择排序方法,它的特点是在排序过程中,将L[1...n]看成一颗完全二叉树的顺序存

深入解析堆排序的算法思想及Java代码的实现演示_java

一.基础知识我们通常所说的堆是指二叉堆,二叉堆又称完全二叉树或者叫近似完全二叉树.二叉堆又分为最大堆和最小堆. 堆排序(Heapsort)是指利用堆这种数据结构所设计的一种排序算法,它是选择排序的一种.可以利用数组的特点快速定位指定索引的元素.数组可以根据索引直接获取元素,时间复杂度为O(1),也就是常量,因此对于取值效率极高. 最大堆的特性如下: 父结点的键值总是大于或者等于任何一个子节点的键值 每个结点的左子树和右子树都是一个最大堆 最小堆的特性如下: 父结点的键值总是小于或者等于任何一个子

【算法导论】排序 (二):堆排序

四.(1)堆排序 第一次听堆排序是在107lab听忠哥讲的,但是没讲怎么实现.那时刚看了数据结 构的二叉树,还以为要通过指针建立二叉树的方式来实现,觉得挺难的. 其实堆排序实现没有想象中 的那么难. "堆"这个词最初是在堆排序中提出来的,但后来就逐渐指"废料收集储存区",就像程 序设计语言Lisp和Java中所提供的设施那样.我们这里的堆数据结构不是废料收集存储区. 堆排序的 运行时间与归并排序一样为O(n lg n),  但是一种原地(in place)排序. (

数据结构中堆排序问题求助

问题描述 数据结构中堆排序问题求助 求解七八九题,答案给的分别是D D D求详细的解法,谢谢了 解决方案 第三题,过程---- 解决方案二: 0,1,6,7,选择完毕之后,只能从2,3里选吧,8有指向它的一个结点啊!!!根据规则不能选- 解决方案三: 数据结构堆排序[数据结构]堆排序[数据结构]堆排序 解决方案四: 其实我觉得你应该去考研论坛问问,或者王道论坛- 解决方案五: http://www.zybang.com/question/bd19e13f1f057532f3e52127d6ebb

深入理解堆排序及其分析_C 语言

记得在学习数据结构的时候一味的想用代码实现算法,重视的是写出来的代码有一个正确的输入,然后有一个正确的输出,那么就很满足了.从网上看了许多的代码,看了之后貌似懂了,自己写完之后也正确了,但是不久之后就忘了,因为大脑在回忆的时候,只依稀记得代码中的部分,那么的模糊,根本不能再次写出正确的代码,也许在第一次写的时候是因为参考了别人的代码,看过之后大脑可以进行短暂的高清晰记忆,于是欺骗了我,以为自己写出来的,满足了成就感.可是代码是计算机识别的,而我们更喜欢文字,图像.所以我们在学习算法的时候要注重算

内部排序算法:堆排序

基本思想 堆的定义 n个关键字序列kl,k2,-,kn称为堆,当且仅当该序列满足如下性质之一(简称堆性质): ki≤k2i且ki≤k2i+1 或 ki≥k2i且ki≥k2i+1(1≤i≤FLOOR(n/2)) 若将此序列所存储的向量R[1..n]看做是一棵完全二叉树的存储结构,则堆实质上是满足如下性质的完全二叉树:树中任一非叶结点的关键字均不大于(或不小于)其左右孩子(若 存在)结点的关键字. 小根堆:根结点(亦称为堆顶)的关键字是堆里所有结点关键字中最小的. 大根堆:根结点(亦称为堆顶)的关键

常见的五类排序算法图解和实现(选择类:简单选择排序,锦标赛排序,树形选择排序,堆排序)

选择类的排序算法 简单选择排序算法 采用最简单的选择方式,从头到尾扫描待排序列,找一个最小的记录(递增排序),和第一个记录交换位置,再从剩下的记录中继续反复这个过程,直到全部有序. 具体过程: 首先通过 n –1 次关键字比较,从 n 个记录中找出关键字最小的记录,将它与第一个记录交换. 再通过 n –2 次比较,从剩余的 n –1 个记录中找出关键字次小的记录,将它与第二个记录交换. 重复上述操作,共进行 n –1 趟排序后,排序结束. 如图   过程图解 令 k=i:j = i + 1: 目