《2017年11月10日》【连续031天】
标题:STL排序算法sort;
内容:A.观看MOOC12.1;
B.STL:标准模板库; 包含多种算法,需要#include<algorithm>
(一)对基本类型的数组从小到大排序:
sort(数组名 +n1,数组名+n2);
n1和n2都是int类型的表达式,可包含变量;n1=0时,+n1可不写;
将数组中下标范围为[n1,n2)的元素从小到大排序。下标为n2的元素不在排序区间内;
void Print(int a[],int size){
for(int i=0;i<size;++i)
cout<<a[i]<<",";
cout<<endl;
}
int main()
{
int a[]={15,4,3,9,7,2,6};
sort(a,a+7); //对整个数组排序
Print(a,sizeof(a)/sizeof(int));
int b[]={15,4,3,9,7,2,6};
sort(b+2,b+5); //对下标为2到下标为5的元素排序;
Print(b,sizeof(b)/sizeof(int));
return 0;
}
(二)对元素类型为T的基本类型数组从大到小排序:
sort(数组名+n1,数组名+n2,greater<T>());
(三)用自定义的排序规则,对任何类型T的数组排序;
sort(数组名+n1,数组名+n2,排序规则结构名());
排序规则结构名的定义方式:
struct 结构名
{
bool operator()(const T & a1,const T & a2){
//若a1应该在a2前面,则返回true。
//否则返回false。
}
} ;
struct Rule1 //从大到小排序
{
bool operator()(const int & a1,const int & a2){
return a1>a2;
}
};
struct Rule2 //按个位数从小到大排序
{
bool operator()(const int & a1,const int & a2){
return a1%10<a2%10;
}
};
int main()
{
int a[]={12,45,3,98,21,7};
sort(a,a+sizeof(a)/sizeof(int));
cout<<"1)";
Print(a,sizeof(a)/sizeof(int));
sort(a,a+sizeof(a)/sizeof(int),Rule1());
cout<<"2)";Print(a,sizeof(a)/sizeof(int));
sort(a,a+sizeof(a)/sizeof(int),Rule2());
cout<<"3)";Print(a,sizeof(a)/sizeof(int));
return 0;
}

使用结构时,比较的元素也可以是自定义的结构;
struct Student{
char name[20];
int id;
double gpa;
};
struct Rule1 //按名字从小到大排序
{
bool operator()(const Student & s1,const Student & s2){
if(stricmp(s1.name,s2.name)<0)
return true;
return false;
}
};
struct Rule2 //按id从小到大排序
{
bool operator()(const Student & s1,const Student & s2){
return s1.id<s2.id;
}
};
struct Rule3 //按gpa从高到低排序
{
bool operator()(const Student & s1,const Student & s2){
return s1.gpa>s2.gpa;
}
};
void Print(Student s[],int size){
for(int i=0;i<size;++i)
cout<<"("<<s[i].name<<","<<s[i].id<<","<<s[i].gpa<<")";
cout<<endl;
};
Student students []={{"Jack",112,3.4},{"Mary",102,3.8},{"Mary",117,3.9},
{"Ala",333,3.5},{"zero",101,4.0}};
int main()
{
int n=sizeof(students)/sizeof(Student);
sort(students,students+n,Rule1());
Print(students,n);
sort(students,students+n,Rule2());
Print(students,n);
sort(students,students+n,Rule3());
Print(students,n);
return 0;
}

明日计划:学习STL二分查找法;
本文详细介绍了C++ STL中的排序算法sort的使用方法,包括基本类型的数组排序、自定义排序规则及对复杂数据结构进行排序等内容,并提供了多个示例代码。

3864

被折叠的 条评论
为什么被折叠?



