zoukankan      html  css  js  c++  java
  • 选择排序之堆排序

      堆排序(HeapSort)是利用堆积树这种数据结构所设计的一种排序算法,他是选择排序的一种,其存储结构类似于完全二叉树:

    二叉堆满足的性质:

      1父节点的值总是大于或者等于(小于或者等于)孩子节点的值的

      2.每个节点的·左右子树都是一个二叉堆。

    当父节点的值大于或者等于任意一个子结点的值时,则成为大根堆;当父节点总是小于或者等于任意一个叶子节点的值时则被称为小根堆。如下图所示:

    左边为小根堆,右边为大根堆。



    对的存数结构一般采用数组,如下图所示。节点下标和在数组里面的值一一对应。

    typedef struct
    {
        KeyType key;
    } RedType;
    
    typedef struct
    {
        RedType r[SIZE + 1];
        int length;
    } SqList;


    堆的创建:

      例如:对上图的大根堆进行排

    将49与08交换,然后对余下的几个数据(不包括49)重新构建大根堆然后将堆顶元素与倒数第二个元素交换,重新构建大根堆。然后重复上述操作,直到堆顶为最小元素。这样利用大根堆进行升序排序就完成

    下面是大根堆的实现代码

    void HeapAdjust(HeapType & H, int s, int m)
    {
        RedType rc;
        rc=H.r[s];
        for(int j=2*s;j<=m;j++)
        {
            if(j<m&&H.r[j].key<H.r[j+1].key)
                j++;
            if(rc.key>H.r[j].key)
                break;
            H.r[s]=H.r[j];
            s=j;
        }
        H.r[s]=rc;
    }
    调整堆,将其排列成大根堆,一次操作只能保证堆顶元素为最大元素。将堆顶元素与当前最大的元素交换。然后在后面的操作中去掉这个元素

    </pre><p><pre name="code" class="cpp">void HeapSort(HeapType & H)
    {
        int temp;
        for(int i=H.length/2;i>0;i--)
            HeapAdjust(H,i,H.length);
    	for(int j=H.length;j>1;j--)
    	{
    		temp=H.r[1].key;
    		H.r[1].key=H.r[j].key;
    		H.r[j].key=temp;
    		HeapAdjust(H,1,j-1);
    	}
    }

    
    

    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    sqlplus中设定行大小、页大小、字符列格式、数字列格式、清屏
    位图索引
    B树索引
    Oracle列自增实现(3)-DEFAULT Values Using Sequences
    Oracle列自增实现(2)-Identity Columns in Oracle Database 12c Release 1 (12.1)
    oracle列自增实现(1)-Sequence+Trigger实现Oracle列自增
    ORA-01502: 索引或这类索引的分区处于不可用状态
    Oracle中的rowid
    Multitenant Architecture---PDB与CDB
    ODI Studio拓扑结构的创建与配置(Oracle)
  • 原文地址:https://www.cnblogs.com/gaot/p/4833818.html
Copyright © 2011-2022 走看看