首页 > 其他分享 >堆排序题解

堆排序题解

时间:2024-10-15 16:19:02浏览次数:7  
标签:27 49 int 题解 堆排序 40 12 81

给定一个整数序列,请按非递减序输出采用堆排序的各趟排序后的结果。

输入格式:

测试数据有多组,处理到文件尾。每组测试数据第一行输入一个整数n(1≤n≤100),第二行输入n个整数。

输出格式:

对于每组测试,输出若干行,每行是一趟排序后的结果,每行的每两个数据之间留一个空格。

输入样例:

4
8 7 2 1
8
40 55 49 73 12 27 98 81

输出样例:

7 1 2 8
2 1 7 8
1 2 7 8
81 73 49 55 12 27 40 98
73 55 49 40 12 27 81 98
55 40 49 27 12 73 81 98
49 40 12 27 55 73 81 98
40 27 12 49 55 73 81 98
27 12 40 49 55 73 81 98
12 27 40 49 55 73 81 98
#include <bits/stdc++.h>
using namespace std;
 
int n, N = 1000;
int a[10000];
 
void HeapAdjust(int a[], int s, int m)
{ //筛选法调整堆
    int x = a[s];
    for (int j = 2 * s; j <= m; j *= 2)
    {
        if (j < m && a[j] < a[j + 1])
            j++;
        if (x >= a[j])
            break;
        a[s] = a[j];
        s = j;
    }
    a[s] = x;
}
 
void CreateHeap(int a[])
{ //建初堆
    for (int i = n / 2; i > 0; i--)
        HeapAdjust(a, i, n);
}
 
void HeapSort(int *a)
{ //堆排序实现
    CreateHeap(a);
    for (int i = n; i > 1; i--)
    {
        swap(a[1], a[i]); //交换堆顶记录和子序列最后一个记录
        HeapAdjust(a, 1, i - 1);
        for (int i = 1; i <= n; i++)
        {
            if (i > 1)
                cout << " ";
            cout << a[i];
        }
        cout << endl;
    }
}
 
int main()
{
    while (cin >> n)
    {
        for (int i = 1; i <= n; i++)
            cin >> a[i];
        HeapSort(a);
    }
    return 0;
}

 

标签:27,49,int,题解,堆排序,40,12,81
From: https://blog.csdn.net/weixin_72525373/article/details/142925931

相关文章

  • 「题解」Educational Codeforces Round 170 (Rated for Div. 2)
    before我不想写作业呜呜。A.TwoScreensProblemA.TwoScreensSol&Code理解题意后发现使用复制的方法完成最长公共前缀即可。#include<bits/stdc++.h>typedeflonglongll;typedefstd::pair<int,int>pii;intT;std::strings1,s2;intmain(){scanf("%d"......
  • CF1955G GCD on a grid 题解
    洛谷链接我们暴力枚举可能的答案\(k\),然后跑一边dp。设\(f_{i,j}\)表示在格子\((i,j)\)是否可以满足有一条路径可以到达该格子且该格子是否为\(k\)的倍数,递推式即为\(f_{i,j}=(k\mida_{i,j}\operatorname{and}(f_{i-1,j}\operatorname{or}f_{i,j-1}))\)最后的答......
  • ARC156C 题解
    blog。显然答案为\(0\)不行。打表发现最优答案总为\(1\)。考虑构造取到\(1\)的下界。观察到,\(\text{LCS}\le1\)等价于去掉两序列都不存在的数后,两序列完全相反。于是有:在\(\{x\},\{y\}\)后增加两序列都不存在的数,不影响LCS。进行\(\{x\}\to\{a,x,b\},\{y\}\to\{b,......
  • # Educational Codeforces Round 170 (Rated for Div. 2) 题解D
    EducationalCodeforcesRound170(RatedforDiv.2)题解DD.AttributeChecks链接:Problem-D-Codeforces思路:由于\(m\)还有\(abs(r[i])\)很小,考虑dp因为每个0能对后面多少个check做出贡献是固定的,所以预处理因为我们每次的0的个数是单调不减的所以,我们上一次......
  • 【题解】P3917 异或序列
    传送门也算是一个有关于异或的小trick吧,简单记录一下。可以维护原序列的前缀异或和\(sum\),于是原题答案贡献变为\(\sum\limits_{i=1}^n\sum\limits_{j=i}^nsum_j\oplussum_{i-1}\)。变形一下为\(\sum\limits_{i=0}^{n-1}\sum\limits_{j=1}^{i+1}sum_i\oplussum_{j}......
  • [TJOI2019] 甲苯先生的字符串 题解
    T2[TJOI2019]甲苯先生的字符串矩阵乘法优化DP,所以一般来说这种DP都不怎么难。30pts的DP是裸的:设\(f_{i,j}\)为前\(i\)位、最后一位是\(j\)的方案数,则有转移方程:\[f_{i,j}=\sum_{k=0}^{25}f_{i-1,k}\landk\nej\]想要矩阵优化,我们想到构造答案矩阵:\[\mathit{an......
  • [PA2021] Od deski do deski 题解
    T1[PA2021]Oddeskidodeski发现合法的字符串一定是类似\(\texttt{aa...aabb...bbcc...cc}\)的形式,也就是若干个\(\texttta\)、若干个\(\textttb\) 和若干个\(\textttc\) 等组成的形式。如果当前选好的串\(S_1\)是合法的,且有另一个合法的串\(S_2\),那么显然\(S_1......
  • 牛客周赛63部分题解
    比赛地址:牛客竞赛_ACM/NOI/CSP/CCPC/ICPC算法编程高难度练习赛_牛客竞赛OJ(nowcoder.com)A.小红的好数#include<bits/stdc++.h>usingnamespacestd;#definelllonglong#defineullunsignedlonglongvoidsolve(){lln;cin>>n;if(n>=10&&n<=99......
  • [ABC213G] Connectivity 2 题解
    好好好。我们设当前处理\(i\)的答案,那么最后的图就可以分成两个部分:\(1\)所在的联通块和其他,根据乘法原理,答案就是它们二者方案的乘积。设\(f_s\)表示集合\(s\)中所有点联通时图的情况数,\(g_s\)表示集合\(s\)中所有点不一定联通时图的情况数,则有:\[ans_i=\sum\limits......
  • 题解:P11132 【MX-X5-T4】「GFOI Round 1」epitaxy
    ProblemLink【MX-X5-T4】「GFOIRound1」epitaxy题目描述给你两个正整数\(n,m\)。定义一个\(1\simn\)的排列\(p\)的价值为所有的\(n-m+1\)个长度为\(m\)的连续子串内最大值的最大公因数。(规定单个数的最大公因数为其自身。)请你求出一个在所有\(1\simn\)......