《从10开始学C++》五(格式化符号,排序)


没有前言

正文

格式化符号

接上文

%d int类型
%lld long long类型
%hd short类型
%f float类型
%lf double类型
%llf long double类型
%c char类型
%s char数组类型(字符串类型,但不能输入string)
特别的 浮点数
%.3f / %.3lf 保留三位小数
%.10lf 保留十位小数

一般情况下就用这么多

排序

选择排序

一般的排序想法是选择排序,就是比较谁最大/最小、第二大/第二小,把谁放前面
最大/最小好找,第二大/第二小怎么找?构造数组吗?
不需要,其实把最大/最小交换到最前面,然后比较从i+1开始就行,可以自动忽略比较过的
模板:

	for(int i=0;i<n;i++){
		int tmp=i;
		for(int j=i+1;j<n;j++){
			if(a[tmp]>a[j])tmp=j;
		}
		swap(a[i],a[tmp]);
	}
	//选择排序,从小到大
	//如果你要从大到小,只需要把if条件里的>换成<即可
	//a是变量名,按实际改

冒泡排序

这个绝对是排序里第二简单简单、第二好用好用的排序了
只需要从前往后遍历,如果当前元素比下一个元素大/小,就交换
这样有一个问题,不太乱的还行,如果太乱了,就可能出现排序仍然不成功的情况,比如
3 2 5 4 7 1 4
从小到大排序后变成
2 3 4 5 1 4 7
1应该是最前面的,但是并没有
怎么办呢?
如果按照惯性思维,for循环外套while循环,如果发现交换了一个元素,tmp就=0,while循环条件是while(!tmp)while(tmp==0)每次进入就tmp=1
有没有更简单的方法呢?,经过测试发现,外层循环的循环次数永远不会超过n-1
为啥总有人闲着没事干去测这玩意儿
模板:

	for(int i=0;i<n-1;i++){
		for(int j=0;j<n-1;j++){
			if(a[i]>a[j])swap(a[i],a[j]);
		}
	}
	//冒泡排序,从小到大
	//如果你要从大到小,只需要把if条件里的>换成<即可
	//a是变量名,按实际改

冒泡排序还有一个特性,如果你不写外层循环的话,且如果你是从小/大到大/小,那么数组的最后一个元素肯定是最大/小,比如你写宇宙总统,你可以使用内层冒泡,输出最后一个元素

桶排序

思路就是把数组中各种数字的个数统计起来,然后根据数字的个数重复输出
思路非常简单,写起来特别难,内存还大,不推荐使用

sort快速排序

这个是标准模板库(STL)给你写好了的快速排序,循环次数是nlogn次,比冒泡还牛
这个绝对是排序最简单、最好用的排序
他是一个函数,但是你传的参数有点特别

默认
	sort(a,a+n);
	//a是变量名,按实际改

这是一个从小到大排序,没想到吧,就这一行

第三个参数参数

从小到大还可以这样:

	sort(a,a+n,less<int>());

从大到小怎么搞?

	sort(a,a+n,greater<int>());

整数类型的从大到小排序,什么类型<>里就填什么类型
为什么呢?less就是升序,括号里如果是升序就返回1,sort函数的第三个参数是怎么比的就怎么排,同理,greater是降序
sort函数第三个参数怎么比就怎么排,那么能不能写一个bool类型函数放里头?可以,一般叫cmp,其他名字也可以

#include<bits/stdc++.h>
using namespace std;
struct set{
	string s;
	int id;
}str[100];int n;//只要带分号可以写在一行里面
bool cmp(set a,set b){
	return a.s==b.s?a.id<b.id:a.s.length()==b.s.size()?a>b:a.size()>b.length();
}
int main(){
	cin>>n;
	for(int i=0;i<n;i++){
		cin>>str[i].s;
		scanf("%d",&str[i].id);
	}
	sort(str,str+n);
	for(int i=0;i<n;i++){
		printf("%d ",str[i].id);
		cout<<str[i].s<<endl;
	}
	return 0;
}
	//高精度分数从大到小,一样则按学号从小到大

话说我咋写了个应用?
awa

归并排序

基本思路就是,把数组拆分成两半,直到不能再分为止,然后比较,再合并回去

手写快速排序

说实话这个挺难的,我也不会AWA

插入排序

我不会AWA

总结

某种意义上只写了格式化符号和sort
doge

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值