您的位置:首页 > 其它

**浙大PAT甲级 1098堆排序

2016-09-07 14:41 246 查看
主要考察了堆排序。具体堆排序的操作点击打开链接

AC代码:

#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#include<hash_map>
#define ll long long
#define inf 24*60*60
using namespace std;
vector<int> v;
vector<int> v1;
void MaxHeapFixdown(vector<int>& x, int i, int n)
{
int j, temp;
temp = x[i];
j = 2 * i + 1;
while (j < n)
{
if (j + 1 < n && x[j + 1] > x[j]) //在左右孩子中找最大的
j++;

if (x[j] < temp)
break;

x[i] = x[j]; //把较大的子结点往上移动,替换它的父结点
i = j;
j = 2 * i + 1;
}
x[i] = temp;
}
void MaxHeapDeleteNumber(vector<int> & x, int n)
{
swap(x[0], x[n - 1]);
MaxHeapFixdown(x, 0, n - 1);
}
int main()
{
int n;
scanf("%d",&n);
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
v.push_back(d);
}
for(int i=0;i<n;i++)
{
int d;
scanf("%d",&d);
v1.push_back(d);
}
int flag=0;
for(int i=1;i<n;i++)
{
int mark;
int tmp=v[i];
for(int j=0;j<i;j++)
{
if(v[i]<v[j])
{
for(int z=i-1;z>=j;z--)
{
v[z+1]=v[z];
}
v[j]=tmp;
break;
}
}
if(v!=v1&&flag==1)
{
printf("%d",v[0]);
for(int z=1;z<n;z++)
{
printf(" %d",v[z]);
}
break;
}
if(v==v1&&flag==0)
{
flag=1;
printf("Insertion Sort\n");
}
}
if(flag==0)
{
printf("Heap Sort\n");
int biao;
for(int i=n-1;i>=0;i--)
{
if(v1[i]<v1[0])
{
biao=i;
break;
}
}
//cout<<biao<<endl;
MaxHeapDeleteNumber(v1,biao+1);
printf("%d",v1[0]);
for(int i=1;i<n;i++)
{
printf(" %d",v1[i]);
}
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: