学习资料:《算法笔记》
sort()函数:
需要algorithm
头文件。
sort(first, last, cmp):
- first是要排序区间首地址
- last是区间尾地址的下一地址
- cmp排序规则,默认升序
也就是说,排序的区间是[a,b)。例如,有一个数组int a[100],要对从a[0]到a[99]的元素进行排序,只要写sort(a,a+100)就行了。
对数组t的第0到len-1的元素排序:sort(t, t+len);
对向量v排序:sort(v.begin(), v.end());
排序的数据类型不局限于整数,只要是定义了<
运算的类型都可以,比如字符串类string,默认按照其字典序。
如果是没有定义<
运算的数据类型,或者想改变排序的顺序,就要用到第三参数——比较函数cmp。
cmp函数:
比较函数cmp是一个自己定义的函数,返回值是bool型,它规定了什么样的关系才是“小于”。
我是这么记的:升序return的时候是小于号,降序则是大于号。
如果想把整数数组按降序排列,可以先定义一个比较函数cmp:
bool cmp(int a, int b){
return a > b;
}
……
sort(a, a+100, cmp);
再看一个复杂一点的例子:
对结构体数组排序:
对于结构体数组arr[100],先按a值升序排列,如果a值相同,再按b值降序排列,如果b还相同,就按c降序排列
struct node{
int a, b, c;
}arr[100];
bool cmp(node x,node y){
if(x.a!=y.a) return x.a < y.a;
if(x.b!=y.b) return x.b > y.b;
return x.c > y.c;
}
……
sort(arr, a+100, cmp);
排名的实现:
有些排序题在排序之后需要给出每个个体的排名,常见的排名规则是:(以分数为例)
分数不同排名不同,分数相同排名相同但占用一个位置。
例如有3个人的成绩是95、95、92,那么这3个人的排名分别是1、1、3。
需要实现排名的要求时,一般需要在结构体定义时把排名定义好,然后一个个赋值(此时已经完成排序):
做法:
将数组第一个个体(以数组下标从0开始为例)的排名记为1,然后遍历剩余个体,如果当前个体的分数等于上一个个体,那么排名与上一个个体相同;否则当前个体的排名等于数组下标+1。
//排序完之后
stu[0].r = 1;
for(int i = 1; i < n; i ++ ){
if(stu[i].score = stu[i-1].score)
stu[i].r = stu[i-1].r;
else stu[i].r = i+1;
}
相关题目: