一、题目分析
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
如果喜欢我的博客,欢迎点赞、评论、收藏~~谢谢
( * ^ ▽ ^ * ) ~