1.排序
int a[100005];
int main()
{
int n,i,j;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%d",&a[i]);
sort(a,a+n);
for(i=0;i<n;i++)
{
if(i) printf(" ");
printf("%d",a[i]);
}
}
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <math.h>
#include <algorithm>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
int a[105],b[105];
int main()
{
int n,i,j,k,p;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
k=1;
while(k<=n&&b[k-1]<=b[k])k++; //若没有等号,测试点4过不去
p=k;
while(k<=n&&a[k]==b[k])k++;
if(k==n+1)
{
printf("Insertion Sort\n");
sort(b+1,b+p+1);
for(i=1;i<=n;i++)
{
if(i!=1)printf(" ");
printf("%d",b[i]);
}
}
else
{
printf("Merge Sort\n");
int flag=0;
for(i=2;i/2<=n;i*=2) //i-步长
{
if(i!=2)
{
for(j=1;j<=n;j++)
{
if(a[j]!=b[j])
break;
}
if(j==n+1)flag=1;
}
for(j=1;j<=n;j+=i)
sort(a+j,a+min(j+i,n+1));
if(flag)break;
}
for(i=1;i<=n;i++)
{
if(i!=1)printf(" ");
printf("%d",a[i]);
}
}
}
#include <stdio.h>
#include <string.h>
#include <string>
#include <map>
#include <vector>
#include <queue>
#include <math.h>
#include <algorithm>
#include <iostream>
#define INF 0x3f3f3f3f
using namespace std;
int a[105],b[105];
void downAdjust(int low,int high)
{
int i=1,j=i*2;//i欲调整结点,j左孩子结点
while(j<=high)
{
if(j+1<=high&&b[j]<b[j+1]) j++;
if(b[i]> b[j]) break;
swap(b[i],b[j]);
i=j;
j*=2;
}
}
int main()
{
int n,i,j,k,p;
scanf("%d",&n);
for(i=1;i<=n;i++)
scanf("%d",&a[i]);
for(i=1;i<=n;i++)
scanf("%d",&b[i]);
//判断是否为插入排序:前k个递增,n-k个与原序列相同
k=1;
while(k<=n&&b[k-1]<=b[k])k++;
p=k;
while(k<=n&&a[k]==b[k])k++;
if(k==n+1)
{
printf("Insertion Sort\n");
sort(b+1,b+p+1);//多插入一个,即前p个有序
}
else
{
printf("Heap Sort\n");
k=n;
while(k>2&&b[k]>=b[2])k--;
swap(b[1],b[k]);
downAdjust(1,k-1);
}
for(i=1;i<=n;i++)
{
if(i!=1) printf(" ");
printf("%d",b[i]);
}
}