冒泡排序的做法
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+7;
int main(){
int n;cin>>n;
int a[N];
for(int i=1;i<=n;i++)scanf("%d",&a[i]);
for(int i=1;i<=n;i++){
for(int j=1;j<=i;j++){
if(a[i]>a[j])swap(a[i],a[j]);
}
}
for(int i=1;i<=n;i++)printf("%d ",a[i]);
}
快排写法
#include<bits/stdc++.h>
using namespace std;
const int N=100007;
int A[N]={0};
void qs(int l,int r){
int i=l,j=r,x=A[l+r>>1];
while(i<=j){
while(A[i]<x)i++;
while(A[j]>x)j--;
if(i<=j)swap(A[i++],A[j--]);
}
if(l<j)qs(l,j);
if(i<r)qs(i,r);
}
int main(){
int n;cin>>n;
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
qs(1,n);
for(int i=n;i>=1;i--)printf("%d ",A[i]);
return 0;
}
也可以用优先队列完成这道题
#include <bits/stdc++.h>
using namespace std;
const int N=1e4+7;
int main(){
priority_queue<int>pq;//最大优先队列
int n,x;cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&x);
pq.emplace(x);//与push用法相同,比push略快
}
while(pq.size()){
printf("%d ",pq.top());
pq.pop();
}
return 0;
}
优先队列的写法,比手写堆结构略慢,下列是手写堆的做法
#include <bits/stdc++.h>
using namespace std;
const int N=1e6+7;
int w[N],tot=0;
void push(int x){//入队
w[++tot]=x;
int p=tot;
while(p>1&&w[p/2]<w[p]){
swap(w[p/2],w[p]);
p/=2;
}
}
void pop(){//出队
swap(w[1],w[tot--]);
for(int i=1,p;i<=tot;i=p){
p=2*i;
if(p+1<=tot&&w[p]<w[p+1])p++;
if(p<=tot&&w[i]<w[p])swap(w[i],w[p]);
else break;
}
}
int main() {
int n,x;cin>>n;
for(int i=1;i<=n;i++){
scanf("%d",&x);
push(x);
}
for(int i=1;i<=n;i++){
printf("%d ",w[1]);
pop();
}
return 0;
}
共 1 条回复
写好点发题解吧