9075排序做法

ylnywys CSP-J2一等 2025-07-18 18:40:05 2025-07-20 11:34:24 3

冒泡排序的做法

#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;
}
{{ vote && vote.total.up }}

共 1 条回复

root 站长

写好点发题解吧