首先我们在OJ上做题的时候,题目会给出时间限制,一般来说,时间限制为1s;这就要求我们所涉及的算法时间复杂度不能超过百万级别,即不能达到一千万。如果算法时间复杂度为O(n^2),则该n不应该大于3000,否则机会达到我们所限制的千万数量级复杂度。举例来说,我们不能在1s的时间限制内对10000个整数进行冒泡排序,而必须使用快速排序等时间复杂度为O(nlog(n))的排序算法。而我们是否需要去记忆这些排序算法呢?实际上,C++已经编写了快速排序库函数,我们只需要在库函数声明#include<algorithm>就可调用排序函数——sort()函数了。
sort函数有三个参数:(sort(start,end,compare))
(1)第一个是要排序的数组的起始地址
(2)第二个是结束的地址(最后一位要排序的地址)
(3)第三个参数是排序的方法,可以是从大到小也可是从小到大,如果不写第三个参数,此时默认的排序方法是从小到大排序。
例1:sort默认从小到大排序
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
例2:sort自定义从大到小排序
#include<iostream>
#include<algorithm>
using namespace std;
bool compare(int x,int y){
return x>y;
}
int main(){
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10,compare);
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
例3:库函数定义less<数据类型>() & greater<数据类型>()
#include<iostream>
#include<algorithm>
using namespace std;
int main(){
int a[10]={9,6,3,8,5,2,7,4,1,0};
sort(a,a+10,less<int>());
//sort(a,a+10,greater<int>());
for(int i=0;i<10;i++){
cout<<a[i]<<" ";
}
cout<<endl;
return 0;
}
例4:对字符排序(九度OJ:1054)
#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int main(){
char a[200];
while(cin>>a){
int n=strlen(a);
sort(a,a+n);
for(int i=0;i<n;i++){
cout<<a[i];
}
cout<<endl;
}
return 0;
}