堆排序 -- 注意headsort中 m的使用 #include <iostream> #include<bits/stdc++.h> using namespace std; int h[80000000]; int m; void siftdown(int i){ int f = 0; while(i*2<=m){ int t; if(h[i]<h[i*2])t = i; else t = i*2; if((i*2+1)<=m&&h[i*2+1]<h[t])t = i*2+1; //边界 if(t==i){ //f =1 ; break; } else{ swap(h[i],h[t]); i = t; //交换 } } } void heapsort(){ int u = m; while(m>1){ swap(h[1],h[m]); m--; siftdown(1);//向下调整 } } int main() { int n; cin>>n>>m; int yy= m; for(int i=1;i<=m;i++){ scanf("%d",&h[i]); } for(int i=m/2;i>=1;i--){ siftdown(i); } for(int i=1;i<=n-m;i++){ int num; scanf("%d",&num); // cout<<" "<<num<<" "<<endl; if(num<h[1]); else{ h[1] = num; for(int j=m/2;j>=1;j--){ siftdown(j); } } } int top = 1; heapsort(); for(int i=1;i<=yy;i++){ if(top)top = 0; else printf(" "); printf("%d",h[i]); } printf("\n"); return 0; } /* 10 8 1 2 4 3 6 5 8 7 10 9 */