【PAT甲级】1098 Insertion or Heap Sort (25 分)

一、题目分析

PS:测试点4没过去

1. 翻译

insertion sort:插入排序
heap sort:堆排序
iterate:迭代
shrink:缩小

2. 分析

1)题意:首先给出一个含有N个数字的初始序列(待排序),再给出一个已经过一部分排列的N个数字序列,根据这两个排列判断使用的是什么排序方法(插入排序或是堆排序)。
2)若使用插入排序,序列最前面的数字是有序的;若使用堆排序,序列最后面的数字是有序的。因此可以通过判断序列前段的数字是否有序判断排序方法,若是有序的,则是插入排序,使用sort函数对前段+1个数字进行重新排序;若是无序的,则是堆排序,从后往前找到第一个小于堆顶元素的元素,交换两个元素的值,并进行向下调整。
3)sort函数注意左闭右开
4)递增序列要建立的是大顶堆
5)样例二的分析过程:(总是把堆的插入和堆排序过程的调整搞混)
在这里插入图片描述

二、代码解析

#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <set>
#include <map>
#include <string>
#include <cstring>
#include <cctype>
#include <unordered_map>
#include <stack>
#include <queue>
using namespace std;
//大顶堆是递增序列
void downAdjust(int a[],int low,int high) {
	int i=low;
	int j=i*2;
	while(j<=high) { //孩子结点存在
		if(j+1<=high&&a[j+1]>=a[j]) { //右孩子结点存在
			j=j+1;
		}
		if(a[i]<a[j]) {
			swap(a[i],a[j]);
			i=j;
			j=i*2;
		} else { //调整结束
			break;
		}
	}
}
int main() {
	int n;
	cin>>n;
	int initial[n+1],partial[n+1];
	for(int i=1; i<n+1; i++) {
		int temp;
		cin>>temp;
		initial[i]=temp;
	}
	for(int i=1; i<n+1; i++) {
		int temp;
		cin>>temp;
		partial[i]=temp;

	}

	int p=1;
	while(p<n&&partial[p]<partial[p+1]) p++;
	int index=p+1;
	while(index<=n&&partial[index]==initial[index]) index++;

	if(index==n+1) {
		cout<<"Insertion Sort"<<endl;
		sort(partial+1,partial+p+2);//注意是左闭右开
	} else {
		cout<<"Heap Sort"<<endl;
		int index=n;
		while(index>2&&partial[index]>=partial[1]) {
			index--;
		}
		swap(partial[index],partial[1]);
		downAdjust(partial,1,index-1);
	}

	for(int i=1; i<=n; i++) {
		cout<<partial[i];
		if(i!=n) cout<<" ";
	}
	return 0;
}

三、我的疑问

请添加图片描述
第4个测试点过不去TAT

如果喜欢我的博客,欢迎点赞、评论、收藏~~谢谢
( * ^ ▽ ^ * ) ~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值