#今天周五早上只有一节微积分,也算是解放啦,然后就可以有大把时间来刷题总结啦。
今天就来复习一波数据排序!!
说到数据排序,首先想到的一定是冒泡排序
毕竟冒泡排序的逻辑和算法也是很好理解的,那在这里就先把冒泡排序说明一下,我用最通俗易懂的语言来论述一波。
冒泡排序
冒泡排序的思路是这样的,为什么叫冒泡呢??
因为他的算法是要求相邻的两个元素之间进行比较,比如如果有n个元素,我们两两进行比较大小,进行n-1次比较,然后就可以找到这个集合中最大的一个元素。ps:像冒泡泡一样,最大值先找出来,然后不管最大值,再重复这样的操作n-2从,就可以找到次大值,然后循环,直到只剩最后一个元素,那么他就是最小值。
因为过程像冒泡泡一样,所以叫冒泡排序。
我们来用具体的实例来演示一波:
这样一个例子,我们首先进行两两比较,第一次两两比较的结果会是这个样子:
然后进行第二次,第三次,一直到最后一次:
这样来说我们在第四次就可以得到了一个从小到大的数列,实现了数据排序的功能。
用代码写冒泡排序也是这个思路,理解了思路,代码部分就简单多了:
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
int a[100];
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n-1;i++)//两两比较,进行了n-1次比较
{
for(int j=1;j<=n-i;j++)//注意进行了n-i次比较,从第一次开始后,每进行一次,少比较一次
{
if(a[j]>=a[j+1]);
swap(a[j],a[j+1]);
}
}
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}
主要就是两个循环,实现冒泡的过程。
到这里为止,应该差不多掌握了最基本的冒泡排序。
那么我们接下来看看这道题,使用冒泡排序的方法来解决:
先自行思考10s,看看自己的思路。
10
9
8
7
……
1
我看到这样一道题的时候,我脑子里想的是,先构建一个结构体,把信息导入进去,然后对结构体的成绩部分进行冒泡排序,得到一个新的数列,之后再判断字母顺序的问题。
也是很简单的一道题,结合了结构体的知识,刚好也能复习一下结构体的构建。
结构体部分如下:
struct student{
string name;
int score;
}a[20];
这样定义一个结构体,再用for循环导入数据。冒泡排序进行对比,
字母顺序部分也好判断,我们直接使用
C++string的compare()比较函数
两个字符串相同,返回0。
调用字符串小与被调用字符串,返回-1。
调用字符串大于被调用字符串,返回1。
字符串说的大小通常和字典顺序是一致的。 字符串小的在字典里靠前,字符串大的在字典里靠后。即返回值是-1的话,调用字符串比被调用字符串靠前;返回值是1的话,调用字符串比被调用字符串靠后。
使用方法就是A.compare(B)判断真假就好啦。
代码部分就如下即可:
#include<bits/stdc++.h>
using namespace std;
int main()
{
struct student{
string name;
int score;
}a[20];
int n;
cin>>n;
student t;
for(int i=0;i<n;i++)
{
cin>>a[i].name>>a[i].score;}
for(int i=0;i<n-1;i++)
for(int j=0;j<n-i-1;j++)
{
if(a[j].score<a[j+1].score)
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
else if(a[j].score==a[j+1].score&&a[j].name.compare(a[j+1].name)>0)
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
for(int i=0;i<n;i++)
cout<<a[i].name<<" "<<a[i].score<<endl;
return 0;
}
以上部分就是关于冒泡排序的知识,也是最简单的数据排序,这个部分是肯定要掌握的!!
我们冒泡的时间复杂度是o(n²),那接下来我们看看我们的STL里面的sort();函数
SORT函数
STL中的sort()并非只是普通的快速排序
,除了对普通的快速排序进行优化,它还结合了插入排序和堆排序。根据不同的数量级别以及不同情况,能自动选用合适的排序方法。
因此学sort函数可以方便节约我们的时间。
sort函数里面有三个参数。sort(begin,end,cmp);
begin为第一个元素,end为最后一个元素。cmp为比较的原则,可以省略,默认情况下是从小到大进行排序。如果要从大到小排序可以将cmp写成great<int>(),然后根据数据类型可以选择float,double等。
int num[10] = {6,5,9,1,2,8,7,3,4,0};
sort(num,num+10,greater<int>());
for(int i=0;i<10;i++){
cout<<num[i]<<" ";
}
sort的强大不止于此,还可以自定义排序。
自定义排序
比如我们相比较一组数,按照个位的大小从大到小来排序。我们可以写一个cmp函数
cmp的类型设置为bool类型,返回真假判断大小即可。
bool cmp(int x,int y){
return x % 10 > y % 10;
}
然后带入sort函数就好。
学习sort确实方便,不过理解深层次的逻辑还是最重要的!
那么我们第三天的学习就到此结束啦!
一起努力加油!!!!
(臭不要脸的想要关注点赞,谢谢大家支持!!)