//1098. Insertion or Heap Sort (25)
#include<cstdio>
#include<algorithm>
using namespace std;
#define maxn 150
int origin[maxn],back[maxn],changed[maxn];
int n;
bool issame(int a[])
{
for(int i=1; i<=n; i++)
{
if(a[i] != changed[i])
return false;
}
return true;
}
int insert_sort()
{
bool flag = false;
for(int i=2; i<=n; i++)
{
if(i!=2 && issame(back))
{
flag = true;
}
sort(back, back+i+1); //多排一趟
if(flag == true)
{
return true;
}
}
return false;
}
void show_array()
{
for(int i=1; i<=n; i++)
{
if(i == 1) printf("%d",back[i]);
else printf(" %d",back[i]);
}
}
//向上调整
void downAdjust(int low,int high)
{
//i为父节点,j为孩子
int i = low, j = i*2;
while (j <= high)
{
if((j+1)<=high && back[j+1]>back[j])
{
j = j+1;
}
//如果父亲比孩子小,那么一直调整
if(back[i]<back[j])
{
swap(back[i], back[j]);
i = j;
j = i*2;
}
else
{
break;
}
}
}
void head_sort()
{
int flag = false;
//先建堆
for(int i=n/2; i>=1; i--)
downAdjust(i,n);
for(int i=n; i>1; i--)
{
if(i != n && issame(back))
{
flag = true;
}
swap(back[i], back[1]);
downAdjust(1, i-1);
if(flag == true)
{
show_array();
return;
}
}
}
int main()
{
//输入个数
scanf("%d",&n);
//输入原始数据
for(int i=1 ;i<=n; i++)
{
scanf("%d",&origin[i]);
back[i] = origin[i];
}
//输入比较数据
for(int i=1; i<=n; i++)
scanf("%d",&changed[i]);
//判断是不是插入排序,是的话输出下一趟
if(insert_sort())
{
printf("Insertion Sort\n");
show_array();
}
//进行堆排序,并输出下一趟
else
{
printf("Heap Sort\n");
for(int i=1; i<=n; i++)
back[i] = origin[i];
head_sort();
}
return 0;
}
1098. Insertion or Heap Sort (25)
最新推荐文章于 2017-05-13 19:44:06 发布