堆排序的代码实现与思考

原创 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;
}

关于堆排序的一些思考

最近在做个堆排序的时候有点疑惑,疑惑在于对一个乱序数组利用堆排序使之有序。 先了解两个概念:小顶堆(根结点的值小于子结点的值)和大顶堆(根结点的值大于子结点的值)。 n个元素的...
  • wangdd_199326
  • wangdd_199326
  • 2017年07月29日 11:50
  • 90

堆排序分析及优化

堆排序,是利用堆结构进行排序,一般是利用最大堆,即根节点比左右两个子树的节点都大,具体算法步骤如下。 一、创建堆         首先将数组中的元素调整成堆,对应下面程序中的createHeap(...
  • x_i_y_u_e
  • x_i_y_u_e
  • 2015年04月09日 15:21
  • 1447

【数据结构与算法】内部排序之三:堆排序(含完整源码)

堆排序、快速排序、归并排序(下篇会写这两种排序算法)的平均时间复杂度都为O(n*logn)。要弄清楚堆排序,就要先了解下二叉堆这种数据结构。本文不打算完全讲述二叉堆的所有操作,而是着重讲述堆排序中要用...
  • mmc_maodun
  • mmc_maodun
  • 2014年03月04日 00:01
  • 23125

堆排序算法及其Java实现(以大根堆为例)

(二叉)堆数据结构是一种数组对象,如图所示(下标从0开始),它完全可以被视为一棵完全二叉树。 接下来要出现的几个词语,这里介绍一下: length[A]: 数组A中元素的个数 heap-si...
  • qq_35178267
  • qq_35178267
  • 2017年10月22日 21:11
  • 291

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

概述:堆排,实际上是一种选择排序,只不过采用了堆这种数据结构,利用这种数据结构,使得在每次查找最大元素时,直接选取堆顶元素,从而时间大大缩短,相对简单选择排序算法来说,比较高效。 堆排序算法可描述如...
  • gl486546
  • gl486546
  • 2017年01月24日 13:45
  • 1313

堆排序与快排比较

昨天做腾讯的笔试题中有一道选择题,问几种排序的最坏情况,快排,冒泡大家肯定都知道是n^2,当时选项中有一个堆排序,不是很确定,下来就把这些收集了一下 表格转自http://www.cnblogs.co...
  • qq_28352347
  • qq_28352347
  • 2017年04月04日 19:36
  • 974

动态规划总结与思考

这是一篇关于动态规划的思考文章,主要讲了我对动态规划的一些思考与总结。...
  • qiuzhijieluojianping
  • qiuzhijieluojianping
  • 2015年01月01日 10:57
  • 778

选择排序——简单选择排序和堆排序,C++代码实现

#include using namespace std; typedef struct { int r[100+1]; int length; }SqList; //简单选择排序...
  • hackerain
  • hackerain
  • 2011年01月07日 16:57
  • 2525

堆排序+代码实现

堆排序 堆,heap,是二叉树的一种。小根堆有这样的性质——任意一个结点的值比它的左右孩子都要小。 排序思想 将待排元素看作是完全二叉树,物理上用一维数组存储。 实现堆排序需要解决两个问题: 1.如何...
  • chuchus
  • chuchus
  • 2014年09月08日 21:54
  • 1578

堆排序代码实现

参考《大话数据结构》P399//堆排序的时间复杂度为O(NlogN),在性能上显然远好于冒泡,简单选择,直接插入的O(n²)的时间复杂度 //不过由于记录的比较与交换是跳跃式进行,因此堆排序是一种不稳...
  • u010232308
  • u010232308
  • 2015年11月23日 17:46
  • 227
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:堆排序的代码实现与思考
举报原因:
原因补充:

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