第二天
堆的建立
#include<iostream>
using namespace std;
const int N = 1000;
int n,a[N];
void sift(int a[],int k,int n)//k是要调整数值的编号,调整范围是从K到N
{
int i = k;
int j = 2*i;
while(j<n)
{
if(j<n && a[j+1]>a[j]) j++;
if(a[i]>a[j]) break;
swap(a[i],a[j]);
i = j;
j = 2*i;
}
}
void Heapsort(int a[],int n)//堆的建立
{
//建立
int i = n/2;
for(i;i>=1;i--)
sift(a,i,n);
//排序
for(i = 1;i<n;i++)
{
swap(a[1],a[n-i+1]);
sift(a,1,n-i);
}
}
int main()
{
int i;
cin>>n;
for(i = 1;i<=n;i++)
{
cin>>a[i];
}
Heapsort(a,n);
for(i = 1;i<=n;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
其中了解到优先队列的本质是堆,一下是优先队列的使用
#include<iostream>
#include<queue>
#include<vector>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int> >q;//从小到大排列
priority_queue<int>q1; //默认顺序从大到小
int n,k;
cin>>n;
while(n--)
{
cin>>k;
q.push(k);
q1.push(k);
}
while(!q.empty())
{
cout<<q.top()<<" ";
q.pop();
}
cout<<endl;
while(!q1.empty())
{
cout<<q1.top()<<" ";
q1.pop();
}
return 0;
}