0%

对排序的一点扯淡

对数据进行排序,是需要经常进行的操作。
手动写排序,归并,冒泡,插入之类的都可以,不过有algorithm自带的sort就省了一些麻烦了。
对需要排序的数组这样写sort(a,a+n)(假设a为需要排序的数组,n为数组的长度)
再细化一点的话,就这样写:sort(a+n1,a+n2),这样是对a数组的下标为n1的元素直到下标为n2的元素进行排序,自然,n2>n1。
但是吧,有时候,需要排序的不仅仅只是一个数组,这个数组与其他的信息有一定的联系,比如这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

struct Student
{
string name;
int score;
};

int main()
{
struct Student stu[3]={"stu1",70,"stu2",80,"stu3",60};//初始化
for(int i=0;i<3;i++)
{
cout<<stu[i].name<<" "<<stu[i].score<<endl;
}
return 0;
}

结构体内为学生的姓名和成绩,我想以成绩为准排序,当然了,姓名和成绩的对应关系不能乱掉。
这个时候肯定不能写成sort(stu,stu+3),需要给sort加上一定的排序依据。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include <iostream>
#include <algorithm>
#include <string>
using namespace std;

struct Student
{
string name;
int score;
};

bool compare(Student a,Student b) //这个比较函数的参数类型也要写成结构体
{
return a.score>b.score;//">"是进行降序排序,如果要升序改成<,其实sort默认是升序
}
int main()
{
struct Student stu[3]={"stu1",70,"stu2",80,"stu3",60};
sort(stu,stu+3,compare);
for(int i=0;i<3;i++)
{
cout<<stu[i].name<<" "<<stu[i].score<<endl;
}
return 0;
}

扯一点题外的,看看的排序

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <iostream>
#include<algorithm>
#include<string>
using namespace std;

class Student
{
public:
string name;
int score;
};

bool compare(Student a,Student b)
{
return a.score>b.score;
}
int main()
{
Student stu[3]={"stu1",70,"stu2",80,"stu3",60};
sort(stu,stu+3,compare);
for(int i=0;i<3;i++)
{
cout<<stu[i].name<<" "<<stu[i].score<<endl;
}
return 0;
}

两段代码的区别仅仅是结构体和类的区别而已,结构体和类长得如此相似,访问成员的方式都如此相似,他们的共同存在真是迷惑了不少人,颇有周瑜和诸葛两人之意。

http://www.cnblogs.com/starfire86/p/5367740.html,此文做了一定的解说,还不错。

生命重在折腾