SSL 1271堆排序I

Posted SSL_ZZL

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SSL 1271堆排序I相关的知识,希望对你有一定的参考价值。

排序I

SSL 1271 排序I


题目

Description

输入n(<=100000)个数,由小到大输出

Input
第一行,一个整数n
第二行,n个数

Output

由小到大输出 n 个数

Sample Input

5
3 2 1 4 5

Sample Output

1 2 3 4 5

解题思路







Code

#include <iostream>
#include <cstdio>
#define N 100000
#define ll long long

using namespace std;

int n;
ll a[N * 4 + 200];

void up(int x) 
	while(x > 1 && a[x / 2] > a[x]) 
		swap(a[x], a[x / 2]);
		x = x / 2;
	


void down(int x) 
	int t = x * 2;
	if (t < n && a[t] > a[t + 1]) t ++;
	while(x <= n && t <= n && a[x] > a[t]) 
		swap(a[x], a[t]);
		x = t, t = x * 2;
		if (t < n && a[t] > a[t + 1]) t ++;
	


int main() 
	scanf("%d", &n);
	for(int i = 1; i <= n; i ++)
		scanf("%lld", &a[i]);
	for(int i = n / 2; i; i --)
		down(i);
	for(int i = 1, m = n; i < m; i ++) 
		printf("%lld ", a[1]);
		a[1] = a[n], n --, down(1);
	
	printf("%lld", a[1]);

以上是关于SSL 1271堆排序I的主要内容,如果未能解决你的问题,请参考以下文章

最小的k个数

堆中的路径(小顶堆的建立以及堆排序)

13堆排序 最小K个数

Java 编写应用程序,从任意50个数中找出最小值并输出

最小的K个数 C++(BFPRT,堆排序)

今日头条实习生面试常见题目 堆排序topk, 反转链表