其实归并排序和插入排序为了做题简单可以直接用sort函数代替。
插入排序的特点是:b数组前面的顺序是从小到大的,后面的顺序不一定,但是一定和原序列的后面的顺序相同~所以只要遍历一下前面几位,遇到不是从小到大的时候,开始看b和a是不是对应位置的值相等,相等就说明是插入排序,否则就是堆排序啦~
插入排序的下一步就是把第一个不符合从小到大的顺序的那个元素插入到前面已排序的里面的合适的位置,那么只要对前几个已排序的+后面一位这个序列sort排序即可。
堆排序的特点是后面是从小到大的,前面的顺序不一定,所以我们只需要倒着就可以找到没排序到当前了,然后和根节点(0)交换一下,然后downadjust。
1098:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<stack>
#include<cmath>
#include<map>
#define inf 0x3f3f3f3f
using namespace std;
const int maxn=100+5;
int a[maxn],b[maxn],n;
bool checkinsert()
{
int k;
for(int i=0;i<n;i++)
{
if(b[i]>b[i+1])
{
k=i+1;
break;
}
}
for(int i=k;i<n;i++)
if(b[i]!=a[i])
return false;
printf("Insertion Sort\n");
sort(b,b+k+1);
return true;
}
void down(int size)
{
int temp=b[0],child,parent;
for(parent=0;parent*2+1<=size;parent=child)
{
child=parent*2+1;
if(child!=size&&b[child]<b[child+1])
child++;
if(temp>=b[child])
break;
else b[parent]=b[child];
}
b[parent]=temp;
}
void doheap()
{
int k;
for(int i=n-1;i>=0;i--)
{
if(b[i]<b[i-1])
{
k=i;
break;
}
}
swap(b[0],b[k]);
down(k-1);
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&a[i]);
for(int i=0;i<n;i++)
scanf("%d",&b[i]);
if(checkinsert())
{
for(int i=0;i<n;i++)
printf("%d%c",b[i],i==n-1?'\n':' ');
}
else
{
printf("Heap Sort\n");
doheap();
for(int i=0;i<n;i++)
printf("%d%c",b[i],i==n-1?'\n':' ');
}
}
1089