挑战30天C艹基本入门(DAY3--数据排序)

#今天周五早上只有一节微积分,也算是解放啦,然后就可以有大把时间来刷题总结啦。

今天就来复习一波数据排序!!

说到数据排序,首先想到的一定是冒泡排序

毕竟冒泡排序的逻辑和算法也是很好理解的,那在这里就先把冒泡排序说明一下,我用最通俗易懂的语言来论述一波。

冒泡排序

冒泡排序的思路是这样的,为什么叫冒泡呢??

因为他的算法是要求相邻的两个元素之间进行比较,比如如果有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确实方便,不过理解深层次的逻辑还是最重要的!

那么我们第三天的学习就到此结束啦!

一起努力加油!!!!

(臭不要脸的想要关注点赞,谢谢大家支持!!)

  • 22
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值