PAT数列排序
19考研结束了
。。
还有11天PAT甲
题目链接:http://lx.lanqiao.cn/problem.page?gpid=T52
题目大意:训练排序
解题思路:
方法一:
直接用C++里的sort函数,
#include<algorithm>
using namespace std;
这两句缺一不可。sort函数的排序不仅仅只用了快速排序,还结合了插入排序和堆排序。然后sort函数原型有三个参数:
1.要排序的数组的起始地址。
2.结束的地址(最后一位要排序的地址)
3.排序的方法。如果省略是默认了从小到大排序。如果从大到小就要自己写https://blog.csdn.net/latte_z/article/details/17049479 、 https://www.cnblogs.com/jjzzx/p/5122381.html
代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[];
scanf("%d", &n);
for(int i = ; i < n; i ++)
scanf("%d", &a[i]);
sort(a, a + n);
for(int i = ; i < n - ; i ++)
printf("%d ", a[i]);
printf("%d\n", a[n - ]);
}
方法二:
冒泡排序(大一学过,发现没学明白,搞了两三天)
冒泡就是每一次都使得max/min去他应该去的位置
但是按照之前琐碎的记忆(n-1趟,j从i开始,for两次,一次n-1,一次n什么的),写了一个错误的代码,如下
/*
冒泡序算法
测试样例
6
2 3 8 5 1 5
*/ #include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int w = ;
int n;
int a[];
scanf("%d", &n);
for(int i = ; i < n; i ++)
scanf("%d", &a[i]); //这是错的方法
for(int i = ; i < n - ; i ++){
for(int j = i; j < n -; j ++){
if(a[j] > a[j + ]){
int temp = a[j];
a[j] = a[j + ];
a[j + ] = temp;
}
}
printf("%d: ", w++);//为了调试找错
for(int k = ; k < n; k ++)
printf("%d ", a[k]);
printf("\n\n");
} printf("\n");
}
百思不得其解,最后发现root(根本)所在,——————(这里用升序来推翻它)
第一个for——比如1,2,3仨数字,我a[0]和a[1]比,再和a[2]比,OK!a[1]再和a[2]比,最后a[2]就不用就谁比较了,因为上一步已经比较过了。所以这里是n-1趟,n-1个数字找到位置了,最后一个就不必麻烦了
第二个for——我i的取值是从i到n-2因为,如果到了n-1,下一步a[j]和a[j + 1]比,会因为a[j]为0,而把a[n - 1]和a[n]调换,最后第一回合,把原数字都给改变了,变成0了。好了!再来说里面循环的事,我a[j]和a[j + 1]比较,做的仅仅是把最大或最小放到了他应去的位置,并不能保证第一位是最小的还是最大,所以我第二次i == 1的时候,直接 j 从 i 开始往后搞,默认了a[0]是最小的了,所以记住代码真坑时间精力也坑自己
那么正解应该是这样的
先考虑升序,有 种分析方法:
1.大的往下沉:
关键代码是两个for,这次外层for是从0到n-2还是共n趟,因为n个数字,n - 1次就可以确定n - 1个正确位置,最后一个(没进入趟的)不用管
接下来内层for注意是要从0开始,因为
if(a[j] > a[j + ])
每次都是相邻两个比较,大的往后去,第一趟结束,最后侧就是最大的了,这样下一次就不需要管它了,直接 j 循环到他前面的那个就好了,比如 i == 1(从0开始),我只需要执行到 j == n - 3就行,下面的
if(a[j] > a[j + ])
使得 a[n - 3] 和 a[n - 2]进行比较,大的会落在a[n - 2]的位置,正好倒数第二个。
完整代码:
#include<cstdio>
int main()
{
int n;
int a[];
scanf("%d", &n);
for(int i = ; i < n; i ++)
scanf("%d", &a[i]);
for(int i = ; i < n - ; i ++)
for(int j = ; j < n - - i; j ++)
{
if(a[j] > a[j + ])
{
int temp = a[j];
a[j] = a[j + ];
a[j + ] = temp;
}
}
for(int k = ; k < n - ; k ++)
printf("%d ", a[k]);
printf("%d\n", a[n - ]); }
(降序就是改成 “<”,小的往下去了)
2.小的往上冒泡(上浮):
这里有点说法,其实如果说要你升序,小的往上,那不能用刚才的代码,因为那个是大的下沉的,改成“<”是降序,所以要另一种思维
这里外层不再说了,内层是 j 从 i + 1 到最后一个n - 1,每次一比较 a[i] 和 a[j],因为 i 是外层,每次不会变,从0开始遍历,那么内层做的就是,你找来一群人,让他们排好队,手里人民币只要比我少的,我直接用 我的所有人民币 和 你的所有的人民币 换, 结束后我手里是这群人堆里最少的人民币数(有这样的好事? 
)
但是经过了这么大折腾,仅仅找到了一个最小的,现在已经放到了第一个位置,后面还是乱序的,甚至不是乱序,也要按照规则,一个一个比较。
完整代码:
#include<cstdio>
#include<algorithm>
using namespace std;
int main()
{
int n;
int a[];
scanf("%d", &n);
for(int i = ; i < n; i ++)
scanf("%d", &a[i]);
for(int i = ; i < n - ; i ++)
{
for(int j = i + 1; j < n; j ++)
{ //小的上浮(升序) <是大的上浮(降序)
if(a[i] > a[j])
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
for(int k = ; k < n; k ++)
printf("%d ", a[k]);
printf("\n\n");
}
for(int k = ; k < n - ; k ++)
printf("%d ", a[k]);
printf("%d\n", a[n - ]); }
至于冒泡排序稳定性,这个比较好https://bbs.csdn.net/topics/370123385、https://zhidao.baidu.com/question/279325341.html
***************************************************只学了皮毛,后续逐渐补充*****************************************
PAT数列排序的更多相关文章
- 洛谷——P1327 数列排序
P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...
- luogu 1327 数列排序 & 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...
- 洛谷 P1327 数列排序
P1327 数列排序 题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入输出格式 输入格式: ...
- lqb 基础练习 数列排序 (sort的使用)
基础练习 数列排序 时间限制:1.0s 内存限制:512.0MB 问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整 ...
- 蓝桥杯 C语言 基础训练 数列排序
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- [蓝桥] 基础练习 数列排序(java)
问题描述 给定一个长度为n的数列,将这个数列按从小到大的顺序排列.1<=n<=200 输入格式 第一行为一个整数n. 第二行包含n个整数,为待排序的数,每个整数的绝对值小于10000. 输 ...
- 【u002】数列排序(seqsort)
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交 ...
- luogu P1327 数列排序
题目描述 给定一个数列{an},这个数列满足ai≠aj(i≠j),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? 输入格式 第一行,正整数n (n<=10 ...
- PAT甲级 排序题_C++题解
排序题 PAT (Advanced Level) Practice 排序题 目录 <算法笔记> 6.9.6 sort()用法 <算法笔记> 4.1 排序题步骤 1012 The ...
随机推荐
- DEV gridview 合并单元格
private void gv_docargo_CellMerge(object sender, DevExpress.XtraGrid.Views.Grid.CellMergeEventArgs e ...
- go 基础 结构体
结构体是类型中带有成员的复合类型.go语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. go语言中的类型可以被实例化,使用new和&构造类型实例的类型是类型的指针. 结构体 ...
- input type file onchange上传文件的过程中,同一个文件二次上传无效的问题。
不要采用删除当前input[type=file]这个节点,然后再重新创建dom这种方案,这样是不合理的.解释如下:input[type=file]使用的是onchange去做,onchange监听的为 ...
- Python与Excel交互——Xlwings实战
这一期直接来实战. 比如说,我们在一个快递网站上爬取了几个快递的轨迹信息,我们需要将数据保存下来,一个常规做法是把数据保存在数据库里(Mysql,MongoDB,Redis),另一个是用Excel的形 ...
- 定了,这个vue.js开源项目,面试时,一定会考问
因为现在的网店,都是用的商城系统, 而实体店都是入座后,扫码打开网上商城进行选购(餐饮,超市等),所以,vue.js迅速开发网上购物商城系统成为了香饽饽, 本人开源2020年4月开发的购物商城系统, ...
- [转]Git详解之四 服务器上的Git
服务器上的 Git 到目前为止,你应该已经学会了使用 Git 来完成日常工作.然而,如果想与他人合作,还需要一个远程的 Git 仓库.尽管技术上可以从个人的仓库里推送和拉取修改内容,但我们不鼓励这样做 ...
- 加分二叉树 vijos1991 NOIP2003第三题 区间DP/树形DP/记忆化搜索
描述 设一个n个节点的二叉树tree的中序遍历为(l,2,3,-,n),其中数字1,2,3,-,n为节点编号.每个节点都有一个分数(均为正整数),记第i个节点的分数为di,tree及它的每个子树都有一 ...
- 使用PHP-Beast加密你的PHP源代码
PHP-Beast是一个PHP源码加密的模块,其使用DES算法加密,用户可以自定义加密的key来加密源代码. 1. PHP-Beast的安装 $ wget https://github.com/lie ...
- 图论--2-SAT--暴力染色法求字典序最小模版
#include <cstdio> #include <cstring> #include <stack> #include <queue> #incl ...
- docker overlay network
下载binary consul wget https://releases.hashicorp.com/consul/1.2.2/consul_1.2.2_linux_amd64.zip unzip ...