【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)样例二的分析过程:(总是把堆的插入和堆排序过程的调整搞混)
【PAT甲级】1098 Insertion or Heap Sort (25 分)_第1张图片

二、代码解析

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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;
}

三、我的疑问

【PAT甲级】1098 Insertion or Heap Sort (25 分)_第2张图片
第4个测试点过不去TAT

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

你可能感兴趣的:(PAT甲级题解笔记,排序算法,数据结构,算法,pat考试)