思路:
堆排序
代码:
#include<bits/stdc++.h>
using namespace std;
void AdjustDown(vector<int>& A,int k,int len, int sortmode){
A[0]=A[k];
for(int i=2*k;i<=len;i*=2){
if(sortmode == 0){ // 升序排序
if(i<len && A[i]<A[i+1]){
i++;
}
if(A[0]>=A[i]){
break;
}else{
A[k]=A[i];
k=i;
}
}
if(sortmode == 1){ // 降序排序
if(i<len && A[i]>A[i+1]){
i++;
}
if(A[0]<=A[i]){
break;
}else{
A[k]=A[i];
k=i;
}
}
}
A[k]=A[0];
}
void BuildMaxHeap(vector<int>& A,int len, int sortmode){
for(int i=len/2;i>0;i--){
AdjustDown(A, i, len, sortmode);
}
}
void swap(int &a,int &b){
int tmp=a;
a=b;
b=tmp;
}
void heapsort(vector<int>& A,int len, int sortmode){
BuildMaxHeap(A, len, sortmode);
for(int i=len;i>1;i--){
swap(A[i],A[1]);
AdjustDown(A, 1, i-1, sortmode);
}
}
void printArr(vector<int>& A,int len){
for (int i = 1; i <= len;i++){
cout << A[i] << " ";
}
cout << endl;
}
int main(){
int num,select;
while(cin>>num){
vector<int> arr;
arr.push_back(0);
int flag;
for(int i=0;i<num;i++){
cin>>flag;
arr.push_back(flag);
}
cin>>select;
heapsort(arr, arr.size() - 1, select);
for(vector<int>::iterator it=arr.begin()+1;it!=arr.end();it++){
cout<<*it<<" ";
}
}
return 0;
}