PAT甲级1098

本文解析PAT甲级1098题目的解题思路及实现代码,该题目要求根据部分排序结果判断使用的是插入排序还是堆排序,并输出下一迭代结果。通过对比排序序列特征来确定所用排序方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PAT甲级1098

题目:
According to Wikipedia:

Insertion sort iterates, consuming one input element each repetition, and growing a sorted output list. Each iteration, insertion sort removes one element from the input data, finds the location it belongs within the sorted list, and inserts it there. It repeats until no input elements remain.

Heap sort divides its input into a sorted and an unsorted region, and it iteratively shrinks the unsorted region by extracting the largest element and moving that to the sorted region. it involves the use of a heap data structure rather than a linear-time search to find the maximum.

Now given the initial sequence of integers, together with a sequence which is a result of several iterations of some sorting method, can you tell which sorting method we are using?

Input Specification:
Each input file contains one test case. For each case, the first line gives a positive integer N (≤100). Then in the next line, N integers are given as the initial sequence. The last line contains the partially sorted sequence of the N numbers. It is assumed that the target sequence is always ascending. All the numbers in a line are separated by a space.

Output Specification:
For each test case, print in the first line either “Insertion Sort” or “Heap Sort” to indicate the method used to obtain the partial result. Then run this method for one more iteration and output in the second line the resulting sequence. It is guaranteed that the answer is unique for each test case. All the numbers in a line must be separated by a space, and there must be no extra space at the end of the line.

Sample Input 1:
10
3 1 2 8 7 5 9 4 6 0
1 2 3 7 8 5 9 4 6 0
Sample Output 1:
Insertion Sort
1 2 3 5 7 8 9 4 6 0
Sample Input 2:
10
3 1 2 8 7 5 9 4 6 0
6 4 5 1 0 3 2 7 8 9
Sample Output 2:
Heap Sort
5 4 3 1 0 2 6 7 8 9

题目大意:给出两串序列,判断是插入排序还是堆排序,并且输出接下来一轮的数据
插入排序特征是到插入的这个数为止,之前全部有序,之后全部无序,所以只要找到第一个非递增的数字,看其之后的序列与原序列对应位置是否相等,如果相同就是插入,不同则是堆排。输出插入排序的时候可以直接用sort函数即可。堆排序每趟从后往前挨个下溯非叶节点,到某一时刻与给出的中间序列相同跳出,然后再排一轮即可。

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

vector<int> initial,partial;
void PercDown(int start,int end){
	int parent=start,child;
	int tmp=initial[parent];
	for(;parent*2<=end;parent=child){
		child=2*parent;
		if((child!=end)&&initial[child]<initial[child+1]) child++;	//取两个孩子中较大的一个
		if(tmp<initial[child]) initial[parent]=initial[child];
		else break;
	}
	initial[parent]=tmp;
}
int main(){
	int n,tmp,i,j;
	scanf("%d",&n);
	initial.push_back(0);
	partial.push_back(0);	//方便之后下标从1开始
	for(i=0;i<n;i++){
		scanf("%d",&tmp);
		initial.push_back(tmp);
	}
	for(i=0;i<n;i++){
		scanf("%d",&tmp);
		partial.push_back(tmp);
	}
	for(i=0;i<n;i++){
		if(partial[i+1]<partial[i]) break;
	}
	for(j=i+1;j<n;j++){
		if(initial[j]!=partial[j]) break;
	}
	if(j==n){
		printf("Insertion Sort\n");
		sort(partial.begin()+1,partial.begin()+i+2);
		for(i=1;i<=n;i++){
			if(i!=1) printf(" ");
			printf("%d",partial[i]);
		}
	}
	else{
		printf("Heap Sort\n");
		for(i=n;i>=1;i--){
			for(j=i/2;j>0;j--)
				PercDown(j,i);
			if(initial==partial) break;
			swap(initial[i],initial[1]);
		}
		swap(initial[i],initial[1]);
		i--;
		for(j=i/2;j>0;j--)
			PercDown(j,i);
		for(i=1;i<=n;i++){
			if(i!=1) printf(" ");
			printf("%d",initial[i]);
		}
	}
	system("pause");
	return 0;
}
### 关于 PAT 甲级 1024 题目 PAT (Programming Ability Test) 是一项编程能力测试,其中甲级考试面向有一定编程基础的学生。对于 PAT 甲级 1024 题目,虽然具体题目描述未直接给出,但从相似类型的题目分析来看,这类题目通常涉及较为复杂的算法设计。 #### 数据结构的选择与实现 针对此类问题,常用的数据结构包括但不限于二叉树节点定义: ```cpp struct Node { int val; Node* lchild, *rchild; }; ``` 此数据结构用于表示二叉树中的节点[^1]。通过这种方式构建的二叉树能够支持多种遍历操作,如前序、中序和后序遍历等。 #### 算法思路 当处理涉及到图论的问题时,深度优先搜索(DFS)是一种常见的解题策略。特别是当需要寻找最优路径或访问尽可能多的节点时,结合贪心算法可以在某些情况下提供有效的解决方案[^2]。 #### 输入输出格式说明 根据以往的经验,在解决 PAT 类型的问题时,输入部分往往遵循特定模式。例如,给定 N 行输入来描述每个节点的信息,每行按照如下格式:“Address Data Next”,这有助于理解如何解析输入并建立相应的数据模型[^4]。 #### 数学运算示例 有时也会遇到基本算术表达式的求值问题,比如分数之间的加减乘除运算。下面是一些简单的例子展示不同情况下的计算结果: - \( \frac{2}{3} + (-2) = -\frac{7}{3}\) -2) = -\frac{4}{3}\) - \( \frac{2}{3} ÷ (-2) = -\frac{1}{3}\) 这些运算是基于样例提供的信息得出的结果[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值