堆排序的代码实现与思考

原创 2016年06月01日 20:45:59

堆的定义如下:n个元素的序列{k1,k2,…,kn}当且仅当满足以下关系时,称之为堆。

这里写图片描述

若将和此序列对应的一维数组看成一个完全二叉树,即堆的含义表明安全二叉树中所有非终端节点的值均不大于(或不小于)其左右孩子节点的值。堆顶元素则必是堆顶最大值或最小值。

具体的分析在严蔚敏的《数据结构》上已经说的很清楚很明白了。作为总结,说一下在代码实现中需要注意的两点。
第一,无序序列构造堆,方向是从叶子节点到根节点结束,所以要从第一个非叶子节点开始进行构造,即从L.length/2的位置开始。
第二,每个位置进行交换之后,可能会导致该子树不再是堆,所以还要对子树进行调整。
以上两点说完就上代码:

#include<iostream>
using namespace std;
const int  MAXSIZE (20);
typedef struct
{
    int r[MAXSIZE+1];
    int length;
}sqList;
void HeapAdjust(sqList &L,int s,int m)
{
    int rc=L.r[s];
    for(int j=2*s;j<=m;j*=2)
    {
        if(j<m&&L.r[j]>L.r[j+1]) ++j;
        if(L.r[s]<=L.r[j]) break;
        int temp=L.r[s];
        L.r[s]=L.r[j];
        L.r[j]=temp;
        s=j;
    }
    L.r[s]=rc;


}
int main()
{
    sqList L;
    L.r[1]=49;
    L.r[2]=38;
    L.r[3]=65;
    L.r[4]=97;
    L.r[5]=76;
    L.r[6]=13;
    L.r[7]=27;
    L.r[8]=49;
    L.length=8;
    //构造堆
    for(int i=L.length/2;i>0;--i)
        HeapAdjust(L,i,L.length);

    //堆排序
    for(int i=L.length;i>=1;--i)
    {
        cout<<L.r[1]<<" ";
        L.r[1]=L.r[i];
        HeapAdjust(L,1,i-1);
    }
    return 0;
}
版权声明:

相关文章推荐

算法导论第六章-堆排序-Cpp代码实现

实现了算法导论第六章中堆排序

堆与堆排序原理及代码实现

一、什么是堆 若数组a[n] 中的元素具有如下的性质: (1)若2*i+1=a[2*i+1]; (2)若2*i+2=a[2*i+2]; 则数组a[n]是一个堆,即任一节点的值不小于它的左子节点的值,也...

算法导论 6章堆排序的代码实现和部分课后练习

以最大堆来实现最大优先队列:/#include #include int parent(int i); //计算父节点的下标 int Left(int i); //计算分支左结点的...

堆排序原理及代码实现

说堆排序之前,我们得先了解一下堆的概念。堆分为大根堆和小根堆,其实就是完全二叉树,大根堆要求是节点的元素要大于其左右孩子的元素;小根堆要求是节点的元素小于其左右孩子的元素;但是两者对于左右孩子谁大谁小...

完全二叉树的创建与堆排序代码实现

堆排序: 创建一棵完全二叉树。 利用完全二叉树进行堆排序。

HeapSort 堆排序 基于伪代码实现

HeapSort 堆排序 基于伪代码实现

【数据结构与算法】【排序】堆排序的代码实现

堆排序是一种选择排序。 前提:数组元素a[0]用作哨兵或临时变量,a[1]~a[n]存放n个待排序的元素。 基本思想是:将待排序的序列构造成一个大顶堆,此时,整个序列的最大值就是堆顶的根结点。将它...

排序算法之堆排序<Heap_Sort>及其C语言代码实现

概述:堆排,实际上是一种选择排序,只不过采用了堆这种数据结构,利用这种数据结构,使得在每次查找最大元素时,直接选取堆顶元素,从而时间大大缩短,相对简单选择排序算法来说,比较高效。 堆排序算法可描述如...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)