您的位置:首页 > 其它

堆排序

2018-03-09 17:29 106 查看
题目描述
    用堆排序对长为N(N<=100000)的整数序列从小到大排序,输出排序后的序列与每个元素在原序列中的位置。输入

    第一行一个数N,表示数列长度
    第2至N+1行,每行一个正整数输出

    每行两个数,用空格隔开,分别表示排序后序列的对应元素与该元素在原序列中的位置样例输入 
5
4
3
1
8
1
样例输出 
1 5
1 3
3 2
4 1
8 4
解题思路:
      这道题目要输出数的位置。说白了还是模板题。想要找一道简单点的堆排题目的话,请点击建堆,想要找一道难的堆排题目的话,请点击病毒
。(ps:出数据的老师使用大根堆倒着输出和小根堆输出的答案是不一样的,如果一个错了,可以用另一个试试看,所以我以下提供两个代码) 代码:(请不要直接拷贝哦)(大根堆倒着输出)
#include<cstdio>
int a[100005],b[100005],c[100005],d[100005],len,n;
using namespace std;
void dfs(int x)
{
int l,r,z;
l=x*2;
r=x*2+1;
if (l<=len)
{
z=l;
if ((r<=len)&&(a[r]>a[l]))
z=r;
if (a[z]>a[x])
{
int t=a[z];
a[z]=a[x];
a[x]=t;
t=b[z];
b[z]=b[x];
b[x]=t;
dfs(z);
}
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=i;
}
len=n;
for (int i=n/2;i>=1;i--) dfs(i);
c[1]=a[1];d[1]=b[1];
for (int i=2;i<=n;i++)
{
len--;
a[1]=a[n-i+2];
b[1]=b[n-i+2];
dfs(1);
c[i]=a[1];d[i]=b[1];
}
for (int i=n;i>=1;i--)
printf("%d %d\n",c[i],d[i]);
return 0;
}

(小根堆)

#include<cstdio>
int a[100005],b[100005],len,n;
using namespace std;
void dfs(int x)
{
int l,r,z;
l=x*2;
r=x*2+1;
if (l<=len)
{
z=l;
if ((r<=len)&&(a[r]<a[l]))
z=r;
if (a[z]<a[x])
{
int t=a[z];
a[z
4000
]=a[x];
a[x]=t;
t=b[z];
b[z]=b[x];
b[x]=t;
dfs(z);
}
}
}
int main()
{
scanf("%d",&n);
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
b[i]=i;
}
len=n;
for (int i=n/2;i>=1;i--) dfs(i);
printf("%d %d\n",a[1],b[1]);
for (int i=2;i<=n;i++)
{
len--;
a[1]=a[n-i+2];
b[1]=b[n-i+2];
dfs(1);
printf("%d %d\n",a[1],b[1]);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: