• 堆排序


    堆排序(Heapsort)是指利用这种数据结构所设计的一种排序算法。堆是一个近似完全二叉树的结构,并同时满足堆性质:即子结点的键值或索引总是小于(或者大于)它的父节点。堆节点的访问

    通常堆是通过一维数组来实现的。在起始阵列为 0 的情形中:

    • 堆的根节点(即堆积树的最大值)存放在阵列位置 1 的地方;

      注意:不使用位置 0,否则左子树永远为 0[2]

    • 父节点i的左子节点在位置 (2*i);
    • 父节点i的右子节点在位置 (2*i+1);
    • 子节点i的父节点在位置 floor(i/2);

    对vector中的数据进行堆排序:

     1 #include <iostream>
     2 #include <vector>
     3 using namespace std;
     4 void HeapAdjust(vector<int> &H,int s,int m)
     5 {
     6     int rc=H[s];
     7     for(int i=s*2;i<=m;i*=2)
     8     {
     9         if(i<m&&i+1<m&&H[i]>H[i+1])//顺着较小的路线向下调整,(这里是要建小顶堆)
    10             i++;
    11         if (rc<H[i])//下面的叶子比堆顶的值大
    12             break;
    13 
    14         H[s]=H[i];//上移子节点
    15         s=i;
    16 
    17     }
    18 
    19     H[s]=rc;//插入堆顶值
    20 
    21 
    22 }
    23 
    24 void HeapSort(vector<int> &H)
    25 {//对vector<int> H,从H[1]....H[H.size()-1]进行堆排序
    26 
    27     for (int i=(H.size()-1)/2;i>=1;i--)
    28     {
    29         HeapAdjust(H,i,H.size()-1);//从最后一个非叶子节点开始向上调整堆,建立堆
    30     }
    31 
    32     for(int i=H.size()-1;i>1;i--)
    33     {
    34         int temp;
    35         temp=H[1];
    36         H[1]=H[i];
    37         H[i]=temp;//把堆顶交换到尾部
    38 
    39         //在对H从H[1].....H[i-1]进行调整
    40         HeapAdjust(H,1,i-1);
    41 
    42     }
    43 
    44 }
    45 
    46 int main()
    47 {
    48     vector<int>  v;
    49     v.push_back(0);//v[0]不用
    50     v.push_back(2);
    51     v.push_back(5);
    52     v.push_back(3);
    53     v.push_back(1);
    54 
    55     HeapSort(v);
    56     for (int i=1;i<v.size();i++)
    57     {
    58         cout<<v[i]<<endl;
    59     }
    60     return 1;
    61 }

    结果:

  • 相关阅读:
    2018常用DOM操作总结
    emlog实现全站pjax无刷新加载页面
    深入理解Vuex 框架
    2018前端最火的web UI框架
    小程序快递单号查询
    表单元素系列二
    表单元素系列一
    表单提交
    AJAX 回调函数刷新页面问题
    electron 常用命令
  • 原文地址:https://www.cnblogs.com/wonderKK/p/2441283.html
Copyright © 2020-2023  润新知