提示:
- 在读入输入时,为某个数据编一个从0~n的序号,可以实现用sort的具有稳定性的排序(sort采用快速排序);
- 稳定的:插入排序、冒泡排序、二叉树排序、归并排序 及其他线性排序;
不稳定的:选择排序、希尔排序、快速排序、堆排序 及有跨度的交换的排序
eg.病人排队
#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);
简单多了。
排序结构体的写法: