没有前言
正文
格式化符号
接上文
%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