做ACM题的时候,排序是一种经常要用到的操作。如果每次都自己写个冒泡之类的O(n^2)排序,不但程序容易超时,而且浪费宝贵的比赛时间,还很有可能写错。STL里面有个sort函数,可以直接对数组排序,复杂度为n*log2(n)。使用这个函数,需要包含头文件。
bool cmp(int a,int b)
{
}
struct node{
}
以下是代码片段:
bool cmp(node x,node y)
{
if(x.b!=y.b) return x.b>y.b;
}
qsort(s[0],n,sizeof(s[0]),cmp);
int cmp(const void *a,const void *b)
{
}
sort函数:#include <algorithm>,默认从小到大,如果降序可写第三方函数进行排序,EXP:sort(array,array+n,cmp)
1.普通排序,升序
[cpp]
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
int a[10]={7,3,4,6,5,1,2,9,8,0};
sort(a,a+10);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
OUTPUT:0 1 2 3 4 5 6 7 8 9
[/cpp]
普通排序,降序
[cpp]
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a,int b)
{
return a>b;
}
int main()
{
int a[10]={7,3,4,6,5,1,2,9,8,0};
sort(a,a+10,cmp);
for(int i=0;i<10;i++)
cout<<a[i]<<" ";
return 0;
}
OUTPUT:9 8 7 6 5 4 3 2 1 0
[/cpp]
2.结构体排序,a升,b降,c降
[cpp]
#include <iostream>
#include <algorithm>
using namespace std;
struct data
{
int a;
int b;
int c;
};
bool cmp(data x,data y)
{
if(x.a!=y.a) return x.a<y.a;
if(x.b!=y.b) return x.b>y.b;
if(x.c!=y.c) return x.c>y.c;
}
int main()
{
.....
sort(array,array+n,cmp);
return 0;
}
[/cpp]
自己也尝试编了一个关于结构体快排的小程序:
#include<iostream>
#include<algorithm>
using namespace std;
struct time
{
int n;
int m;
}s[10];
bool cmp(time x,time y)
{
return x.m<y.m;
}
int main()
{
int i;
for(i=0;i<5;i++)
cin>>s[i].n>>s[i].m;
sort(s,s+5,cmp);
for(i=0;i<5;i++)
cout<<s[i].n<<" "<<s[i].m<<endl;
return 0;
}