信息学奥赛一本通_用sort进行具有稳定性的排序

提示:
  1. 在读入输入时,为某个数据编一个从0~n的序号,可以实现用sort的具有稳定性的排序(sort采用快速排序);
  2. 稳定的:插入排序、冒泡排序、二叉树排序、归并排序 及其他线性排序;
        不稳定的:选择排序、希尔排序、快速排序、堆排序 及有跨度的交换的排序
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;

struct p{
	char id[12];
	int age;
	int xu;
}pat[105];

char com[105][12];

struct cmp{
	bool operator ()(const p &a,const p &b){
		if(a.age != b.age) return a.age > b.age;
		else               return a.xu < b.xu;//比较序号 
 }
};


int main(){
	int n,i,j=0,k=0;
	int age;
	char id[12];
	cin>>n;
	for(i=0;i<n;i++){
		cin>>id>>age;
		if(age>=60){
			swap(pat[j].id,id);
			pat[j].age = age;
			pat[j].xu = j;//登记序号 
			j++;
		}
		else{
			swap(com[k],id);
			k++;
		} 
	}
	
	sort(pat,pat+j,cmp());
	
	for(i=0;i<j;i++){
		cout<<pat[i].id<<endl;
	}
	for(i=0;i<k;i++){
		cout<<com[i]<<endl;
	}
	return 0;
}
刚开始做习题,是定义多个数组,手写排序一起交换;
#include <iostream>
#include <cstdio> 
using namespace std;

int xuehao[110];
double score[110];


int main()
{
	int n,k1;
	cin>>n>>k1;
	for(int i=0;i<n;i++){
		cin>>xuehao[i]>>score[i];
	}
	int i,j,k;
	int tem;
	double temp;
	for(i=0;i<n;i++){
		k=i;
		for(j=i+1;j<n;j++)
			if(score[j]>score[k]) k=j;
		if(k != i){
			temp = score[i]; score[i] = score[k] ; score[k] = temp;
			tem = xuehao[i]; xuehao[i]= xuehao[k] ; xuehao[k] =tem;
		}
	}
	printf("%d %g",xuehao[k1-1],score[k1-1]);
	return 0;
}
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;

const int Maxn=300;
int score[Maxn];
int name[Maxn];
int chinese[Maxn];

int main(){
	int n,k,i,j,temp;
    int c,s,e;
	cin>>n;
	for(i=0;i < n;i++){
		cin>>c>>s>>e;
		score[i] = c+s+e;
		chinese[i] = c;
		name[i]=i+1;
	}
	for(i=n-1;i>=1;i--){
        for(j=0;j<i;j++){
			if(chinese[j] < chinese[j+1]){ 
				swap(score[j],score[j+1]);
				swap(name[j],name[j+1]);
				swap(chinese[j],chinese[j+1]);
			}
        }
    }	
      
    
	for(i=n-1;i>=1;i--){
        	for(j=0;j<i;j++){
			if(score[j]< score[j+1]){ 
				swap(score[j],score[j+1]);
				swap(name[j],name[j+1]);
				swap(chinese[j],chinese[j+1]);
			}
        }
        }
	for(i=0;i<5;i++){
		cout<<name[i]<<" "<<score[i]<<endl;
	}
	return 0;
} 
后来写到“奖学金”的时候,发现太麻烦了,又想起可以用sort函数
struct student{
    int chi,tot,name;//语,总分,号码
}a[1001];
bool cmp(student a,student b){
    if(a.tot!=b.tot)return a.tot>b.tot;
    if(a.chi!=b.chi)return a.chi>b.chi;
    else return a.rank<b.rank;
    return 0;
}
sort(a,a+n,cmp);

简单多了。
排序结构体的写法:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值