数组模拟堆进行快速排序:
#include <bits/stdc++.h>
using namespace std;
const int maxn=100000+10;
int a[maxn],len,n,k;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&k);
len++;
a[len]=k;
int t=len;
while(t>1 && a[t]<a[t/2]){
swap(a[t],a[t/2]);
t/=2;
}
}
for(int i=1;i<=n;i++){
printf("%d ",a[1]);
a[1]=a[len--];
int t=1;
while((t*2<=len&&a[t]>a[t*2])||(t*2+1<=len&&a[t]>a[t*2+1])){
int u=t*2;
if(u+1<=len&&a[u]>a[u+1])
u++;
swap(a[t],a[u]);
t=u;
}
}
return 0;
}
哈夫曼树实现合并果子:
#include<bits/stdc++.h>
using namespace std;
const int maxn=10000+5;
int a[maxn];
int main(){
int i,j,k,m,n;
cin>>n;
for(i=1;i<=n;i++){
scanf("%d",&a[i]);
k=i;
while(k>1 && a[k]<a[k/2]){
int tmp=a[k];a[k]=a[k/2];a[k/2]=tmp;
k/=2;
}
}
int ans=0;
int len=n;
for(i=1;i<n;i++){
int fkq=a[1];
a[1]=a[len--];
k=1;
while((k*2<=len && a[k]>a[k*2])||(k*2+1<=len && a[k]>a[k*2+1])){
int u=k*2;
if(u+1<=len && a[u]>a[u+1])u++;
int tmp=a[k];a[k]=a[u];a[u]=tmp;
k=u;
}
int ltt=a[1];
a[1]=a[len--];
k=1;
while((k*2<=len && a[k]>a[k*2])||(k*2+1<=len && a[k]>a[k*2+1])){
int u=k*2;
if(u+1<=len && a[u]>a[u+1])u++;
int tmp=a[k];a[k]=a[u];a[u]=tmp;
k=u;
}
int PrincessQiQi=fkq+ltt;
ans+=PrincessQiQi;
a[++len]=PrincessQiQi;
k=len;
while(k>1 && a[k]<a[k/2]){
int tmp=a[k];a[k]=a[k/2];a[k/2]=tmp;
k/=2;
}
}
cout<<ans;
return 0;
}