NOIP 提高组初赛 · NOIP 2007 提高组初赛试题 第 26 题

选择题 · 答案 No.1:XTORSEAAMPLE No.2:AAEELMOPRSTX · 考点:堆(Heap)、基础算法

← 整套速查表 NOIP 提高组初赛 全部真题

题目

看程序写结果

#include "stdio.h"
char	ch[] = { 'q', 'A', 'S', 'O', 'R', 'T', 'E', 'X', 'A', 'M', 'P', 'L', 'E' };
int	n = 12;
void shift( int k, int n )
{
	char	v;
	int	j;
	v = ch[k]; j = k + k;
	while ( j <= n )
	{
		if ( (j < n) && (ch[j] < ch[j + 1]) )
			j++;
		if ( v < ch[j] )
		{
			ch[j / 2] = ch[j]; j *= 2;
		}else
			return;
		ch[j / 2] = v;
	}
}


void hpsrt( void )
{
	int	k;
	char	tmp;
	for ( k = n / 2; k > 0; k-- )
		shift( k, n );    /* 建堆*/
	printf( "No.1: " );
	for ( k = 1; k <= n; k++ )
		putchar( ch[k] );
	putchar( '\n' );
	for ( k = n; k > 0; k-- )
	{
		tmp = ch[1]; ch[1] = ch[k]; ch[k] = tmp;
		shift( 1, k - 1 );
	}
}


main()
{
	int k;
	hpsrt();
	printf( "No.2: " );
	for ( k = 1; k <= n; k++ )
		putchar( ch[k] );
	putchar( '\n' );
}

输出:________

答案:No.1:XTORSEAAMPLE No.2:AAEELMOPRSTX

考点

堆(Heap) 讲解 →堆(Heap) 真题汇总 →基础算法

解题思维

堆排序:No.1 为建堆结果(大顶堆),No.2 为排序输出(升序)。

常见错误

区分"建堆阶段"与"排序阶段"的输出。

详细解析(节选)

堆排序

ch[1..12]={q,A,S,O,R,T,E,X,A,M,P,L,E}

建堆(大顶堆) → No.1: XTORSEAAMPLE 排序(升序)→ No.2: AAEELMOPRSTX

复杂度:O(n log n)

同考点真题

在 OI伴学 里做这道题
登录后可计时作答、查看完整六段式解析,并按你的错题自动生成同类练习。
去刷题先做一次 AI 学情诊断