首页 > 其他分享 >T233293 【模板】堆排序

T233293 【模板】堆排序

时间:2023-04-22 14:36:52浏览次数:46  
标签:tmp start int 堆排序 T233293 HeapAdjust 排序 模板

题目描述

利用堆排序算法将读入的 N 个数从小到大排序后输出。

输入格式

第 11 行为一个正整数 N,第 22 行包含 N 个空格隔开的正整数 ai​,为你需要进行排序的数,数据保证了 Ai​ 不超过 109109。

输出格式

将给定的 N 个数从小到大输出,数之间空格隔开,行末换行且无空格。

输入输出样例

输入 #1
5
4 2 4 5 1
输出 #1
1 2 4 4 5

说明/提示

对于 20% 的数据,有 N≤103;

对于 100% 的数据,有 N≤105。

题解

首先将待排序的数组构造成一个大根堆。将无序的序列看成一个堆结构,将序列里的值按照从上往下,从左往右的顺序依次填充到二叉树中。接着,找到一个非叶子节点,比较它的左右节点中最大的一个的值,如果比它大,就交换位置。不断重复这一步骤,直到构造出一个大根堆。

接下来进行排序。首先将顶端元素和末尾元素交换,交换后末尾元素不变,剩余元素重构大根堆。经过不断的重复,最后得到最终的排序结果。

 

#include <iostream>

using namespace std;
void HeapAdjust(int* a, int start, int end)
{
    int tmp = a[start];
    for (int i = 2 * start + 1; i <= end; i = i * 2 + 1)
    {
        if (i < end&& a[i] < a[i + 1])
        {
            i++;
        }
        if (a[i] > tmp)
        {
            a[start] = a[i];
            start = i;
        }
        else
        {
            break;
        }
    }
    a[start] = tmp;
}
void HeapSort(int* a, int n)
{
    for(int i=(n-1-1)/2;i>=0;i--)
    {
        HeapAdjust(a, i,n - 1);
    }
    int tmp;
    for (int i = 0; i < n - 1; i++)
    {
        tmp = a[0];
        a[0] = a[n - 1-i];
        a[n - 1 - i] = tmp;
        HeapAdjust(a, 0, n - 1-i- 1);
    }
}
int main()
{
    int n,i,j,t,k;
    cin>>n;
    int a[n];
    for(i=0;i<n;i++)
    {
        cin>>a[i];
    }
    HeapSort(a,n);
    for(i=0;i<n;i++)
    {
        cout<<a[i]<<" ";
    }
    return 0;
}

 

 

 

标签:tmp,start,int,堆排序,T233293,HeapAdjust,排序,模板
From: https://www.cnblogs.com/dachi7/p/17343014.html

相关文章

  • 堆排序
    1.堆的定义: 在一颗完全二叉树中,每一个根节点的值均大于(或小于)其左右子树根节点的值,被称为堆。堆分为两种类型:大根堆和小根堆。其中每一棵子树的根节点的值大于等于左右子树节点的值,被称大根堆。如果是每个节点的值均小于等于左右节点的值,被称为小根堆。......
  • 基础算法-堆排序
    思路堆是一种完全二叉树,其中每个节点的值都大于或等于其子节点的值,被称为“大根堆”;或者每个节点的值都小于或等于其子节点的值,被称为“小根堆”。在堆排序中,我们使用的是大根堆,即根节点的值是最大的元素。堆排序的基本思路是:建立一个大根堆。将待排序的序列构建成一个大根堆,......
  • 模板——图论
    缩点(强连通分量)点击查看代码constintN=1e5+5,inf=1e9;vector<int>a[N];stack<int>stk;boolvis[N],instk[N];intdfn[N],low[N],col[N],w[N];//co:染色结果,w:点权vector<int>sz;//sz:第i个颜色的点数intn,m,dcnt;//voiddfs(intx){//Tarjan求强联通分量......
  • phpStorm自定义快捷键,输出代码块,模板
    在开发过程中经常需要打印数据调试,var_dump()或print_r都没办法直观的查看数据,我一般用如下代码打印数据,但是每次手动输入又麻烦,所以设置一个快捷键就能输出一下代码,岂不是一劳永逸:1.进入设置对话框:File->Setting2.接下自定义快捷键:按一下步骤操作完,点击"ok"键![在这......
  • Gstreamer Pad模板介绍
    Pad模板在GStreamer中,Pad模板(PadTemplate)共有两种类型:静态Pad模板(StaticPadTemplate)和动态Pad模板(DynamicPadTemplate)。静态Pad模板是在元素的代码中预定义的,它描述了Pad的名称、方向、数据类型、标识符和其他属性。静态Pad模板用于描述元素的固有能力,因此在......
  • 在线简历制作模板
    分享两个比较好的在线简历制作模板: 链接:https://www.resumeis.com/home极简:链接地址:https://www.polebrief.com/edit......
  • 一维与二维前缀和(蓝桥杯复习+例题讲解+模板c++)
    文章目录前缀和二维前缀和总结3956.截断数组99.激光炸弹前缀和前缀和是一种常见的算法,用于快速计算数组中某一段区间的和。前缀和的思想就是预处理出数组中前缀和,然后用后缀和减去前缀和,即可快速计算区间和。以一维数组为例,设表示数组中第个元素的值,表示数组中前个元素的......
  • 单调队列(例题详解+模板cpp)
    有一类问题需要维护一段区间内的最大值或最小值,例如滑动窗口、区间最值等问题。一般情况下,我们可以使用线段树、ST表等数据结构来解决这类问题,但是这些数据结构的实现较为复杂,需要一定的时间和精力来学习和掌握。而单调队列则是一个简单而高效的数据结构,可以用来解决这类问题。基本......
  • Trie字典树(例题详解+模板cpp)
    字典树(Trie树)一:概念字典树是一种树形结构,用于存储一组字符串,支持快速的字符串查找和前缀匹配。字典树的本质是利用字符串之间的公共前缀,将具有相同前缀的字符串合并在一起,从而实现高效的字符串操作。数据结构字典树是一棵多叉树,每个节点包含若干个指向子节点的指针,每个节点代表一......
  • 图的最短路问题(综合详解!!!看这一篇就够了)(spfa-Dijkstra-floyd-模板代码c-)
    文章目录图论:三种最短路及模板模板SPFA算法Floyd算法Dijkstra算法例题与应用反向建边最短路计数1488.最短距离3305.作物杂交4074.铁路与公路图论:三种最短路及模板注意:在这三种算法中我均使用的链式前向星存图,具体方式请看我这篇博客:链式前向星存图详解模板SPFA算法spfa是优化......